对象在转换类型的时候,会调用内置的 [[ToPrimitive]]
函数,对于该函数来说,算法逻辑一般来说如下:
方法返回指定对象的原始值。如果对象没有原始值,则valueOf将返回对象本身。
返回一个表示该对象的字符串。
如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型。
[[ToPrimitive]]
)[[ToPrimitive]]
)+a
一个加号后跟非数字类型,直接转成数字(优先级最高))1 + '1' // '11'
true + true // 2
4 + [1,2,3] // "41,2,3"
'a' + + 'b' // -> "aNaN"
('b' + 'a' + + 'a' + 'a').toLowerCase() // 'banana'
4 * '3' // 12
4 * [] // 0
4 * [1, 2] // NaN
[] == ![] // true
"" == ![] // true
1 == ![] // false
0 == ![] // true
第一个式子计算过程:
[] == ![]
[] == !true // ! 操作符的优先级高于 == ,所以先执行 ! 操作
[] == false // !true 得到的是 false
[] == 0 // 比较规则1:如果值为true或false,则转成1或0来继续比较
[] == 0 // 执行左侧的 [] 的 valueOf 方法,而 [] 是对象,所以 [].valueOf() 返回本身 []
"" == 0 // 执行左侧的 [] 的 toString 方法,[].toString() 返回 ""
0 == 0 // 比较规则2:如果一个值是数字,一个值是字符串,则把字符串转换为数字,再进行比较,"" 转成数字是 0
最终是执行 0 == 0 ,结果为 true
[[ToPrimitive]]
!
后跟 x,x 直接转布尔