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
undefined
turns intofalse
.null
turns intofalse
.0
,-0
, andNaN
turn intofalse
; other numbers turn intotrue
.0n
turns 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') //32
1
2
2
除了 +
有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值
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 // NaN
1
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 // true
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12