类型转换
Date()构造函数,当它收到一个不是Date实例的参数时 —— 字符串表示日期字符串,而数值表示时间戳。+运算符 —— 如果运算对象(两边只要有一边儿是)是字符串,执行字符串串联;否则,执行数值相加。==运算符 —— 如果一个运算对象是原始值,而另一个运算对象是对象(object),则该对象将转换为没有首选类型的原始值。
js
console.log({} + []); // "[object Object]"1
{} 和 [] 都没有 [Symbol.toPrimitive]() 方法。 {} 和 [] 都从 Object.prototype.valueOf 继承 valueOf() ,其返回对象自身。因为返回值是一个对象,因此它被忽略。因此,调用 toString() 方法。{}.toString() 返回 "[object Object]" ,而 [].toString() 返回 "" ,因此这个结果是它们的串联: "[object Object]" 。
有三种不同的路径可以将对象转换为原始值:
- 原始值强制转换:
[Symbol.toPrimitive]("default")→valueOf()→toString() - 数字类型强制转换、number 类型强制转换、BigInt 类型强制转换:
[Symbol.toPrimitive]("number")→valueOf()→toString() - 字符串类型强制转换:
[Symbol.toPrimitive]("string")→toString()→valueOf()
boolean
undefinedturns intofalse.nullturns intofalse.0,-0, andNaNturn intofalse; other numbers turn intotrue.0nturns intofalse; other BigInts turn intotrue.- The empty string
""turns intofalse; other strings turn intotrue. - Symbols turn into
true. - All objects become
true.
String
- 字符串按原样返回。
undefined转换成"undefined"。null转换成"null"。true转换成"true";false转换成"false"。- 使用与
toString(10)相同的算法转换数字。 - 使用与
toString(10)相同的算法转换 BigInt。 - Symbol 抛出
TypeError。 - 对于对象,首先,通过依次调用其
[Symbol.toPrimitive]()(hint 为"string")、toString()和valueOf()方法将其转换为原始值。然后将生成的原始值转换为一个字符串。
Number
- Number 将按原样返回
undefined转换为NaN。null转换为0。true转换为1;false转换为0。- 字符串将被假定为包含数字字面量,并通过解析它们来转换。解析失败会得到
NaN。与实际数字字面量相比,它们有一些细微的差别:- 前导和尾随的空格 / 换行符会被忽略。
- 前导的数字
0不会导致该数值成为八进制字面量(或在严格模式下被拒绝)。 +和-允许出现在字符串的开头以指示其符号。(在实际代码中,它们 “看起来像” 文字的一部分,但实际上是独立的一元运算符。)然而,该标志只能出现一次,并且后面不能跟空格。Infinity和-Infinity被当作是字面量。在实际代码中,它们是全局变量。- 空字符串或仅包含空格的字符串转换为
0。 - 不允许使用数字分隔符。
- BigInt 抛出
TypeError,以防止意外的强制隐式转换导致精度损失。 - Symbol 抛出
TypeError。 - 对象首先通过按顺序调用它们的
[Symbol.toPrimitive]()(使用"number"提示)、valueOf()和toString()方法将其转换为原始值。然后将得到的原始值转换为数字。
Object
另外
parseInt()
parseInt 相比 Number ,就没那么严格了, parseInt 函数逐个解析字符,遇到不能转换的字符就停下来
js
parseInt('32a3') //321
除了 + 有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值
js
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 // NaN
null + 1 // 1
undefined + 1 // NaN1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
null 转为数值时,值为 0 。 undefined 转为数值时,值为 NaN
等号
等于操作符( == )在比较中会先进行类型转换,再确定操作数是否相等
null 和 undefined 相等
如果有任一操作数是 NaN ,则相等操作符返回 false
如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法取得其原始值,再根据前面的规则进行比较
如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true
全等操作符由 3 个等于号( === )表示,只有两个操作数在不转换的前提下相等才返回 true 。即类型相同,值也需相同
js
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n' == 0 // true1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12