类型转换
Jonnzer Lv4
  • 从定义来讲,类型转换,就是将值从一种类型转为另一个种类型(显式转换)。
    另外还有一种隐式的转换,也成为强制类型转换。
1
2
3
var a = 42
var b = a + '' // 隐式强制类型转换
var c = String(a) // 显式强制类型转换

字符串拼接

1
2
3
const a = 100 + 10 // 110
const b = 100 + '10' // '10010'
const c = true + '10' // 'true10'

==

1
2
3
4
5
6
100 == '100' // true
0 == '' // true
0 == false // true
false == '' // true
null == undefined // true

建议:除了 == null 外,其他都用 === :

1
2
const  obj = { x: 100 }
if (obj.a == null) {} // 相当于 obj.a === null || obj.a === undefined

if 语句和逻辑运算

!!转换符 可以取到 该值的布尔值

以下都是 falsely 变量。除此之外,都是 truly 变量

1
2
3
4
5
6
!!0 === false
!!NaN === false
!!'' === false
!!null === false
!!undefined === false
!!false === false

注意:!!{} 是 true 、 !![] 是 true

逻辑判断

1
2
3
4
10 && 0 // 0
0 && 10 // 0
'' || 'abc' // 'abc'
!window.abc // true

ES5规范,定义了部分转换规则:( ToString 、 ToNumber、ToBoolean、 ToOrimitive )

ToString:

(1) 基本类型:
null => ‘null’ 、 undefined => ‘undefined’ 、 true => ‘true’ 、 2 => ‘2’
(2) 极小值和极大值单独处理:

1
2
3
var a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000

a.toString() // 1.07e21

(3) 对象:

1
2
3
4
5
6
7
8
9
10
var toString = Object.prototype.toString;

toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]

//Since JavaScript 1.8.5
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]

(4) 数组:
数组的 toString ,将所有单元字符串化,然后用’,’连接起来

1
2
3
var a = [1,2,3]
a.toString() === '1,2,3' // true

(5) JSON.stringify()
分为对象 和 数组的不同处理 :
对象时,会忽略 undefined function symbol
数组时,会把 undefined function symbol 转为 null

不能处理包含循环引用的对象

1
2
3
4

JSON.stringify( [1,undefined,function(){},4] ) // '[1,null,null,4]'

JSON.stringify({ a:2, b:function(){} } ) // '{"a":2}'

额外知识:
我们可以向 JSON.stringify(..) 传递一个可选参数 replacer, 它可以是数组或者函数, 用 来指定对象序列化过程中哪些属性应该被处理,哪些应该被排除.
如果 replacer 是一个数组,那么它必须是一个字符串数组,其中包含序列化要处理的对象 的属性名称,除此之外其他的属性则被忽略。

如果 replacer 是一个函数, 它会对对象本身调用一次, 然后对对象中的每个属性各调用 一次,每次传递两个参数,键和值。如果要忽略某个键就返回 undefined ,否则返回指定 的值。

1
2
3
4
5
6
7
8
9
var a = {
b: 42,
c: "42",
d: [1,2,3]
}
JSON.stringify( a, ["b","c"] ) // "{"b":42,"c":"42"}"
JSON.stringify( a, function(k,v){ // "{"b":42,"d":[1,2,3]}"
if (k !== "c") return v;
})

ToNumber

true => 1 、false => 0 、 undefined => NaN 、 null => 0
处理对象、数组,会看处理值,是否内部有 valueOf() 方法,有则调用并返回基本类型值,使用该值进行强制类型转换
没有则使用 toString() 的返回值来进行强制类型转换。
如果这两个方法都没返回基本类型值,会产生 TypeError 错误。

ToBoolean

以下这些是假值:
• undefined
• null
• false
• +0 、 -0 和 NaN
• “”

推荐使用 Boolean() 和 !! 来显示转换布尔值。

顺路说一条parseInt的奇特题目:
[1,2,3].map(parseInt) // [1, NaN, NaN]

parseInt api 和 map api都要了解,才能正确解答此题。

参考:
segmentFault parseInt题解析
(你不知道的js《中卷》)[]

  • 本文标题:类型转换
  • 本文作者:Jonnzer
  • 创建时间:2021-07-13 09:30:00
  • 本文链接:https://jonnzer.github.io/2021/07/13/JS/类型转换/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论