console.log([] == 0) // true 和数字比较会转成数字进行比较 Number([]) => Number('') => 0
console.log([1,2] == '1,2') //true 和字符串比较,会将数组先转成字符串
console.log([1,2] == '[1,2]') //false 数组 [1,2] 转成字符串为 "1,2"
console.log({} == 0) // false 对象转成数字为NaN
console.log({} == '[object Object]') //true 对象转成字符串为 '[object Object]'
console.log({} == {}) // false 对象比较的是地址,所以对象永远不等
console.log({} == Object) //false 对象比较的是地址,所以对象永远不等
console.log(!{} == 0) // true 取反只能作用于布尔值,对象转成布尔值都为true
console.log(![] == 0) // true 取反只能作用于布尔值,对象转成布尔值都为true
console.log(!{} == ![]) // true 取反只能作用于布尔值,对象转成布尔值都为true,取反后都为false
Number() 函数基于如下规则执行转换。
布尔值: true转换为1, false转换为0。
数值: 直接返回。
null: 返回0。
undefined: 返回NaN。
字符串: 应用以下规则。
1、如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。
因此,Nnmber("1") 返回 1,Number("123") 返回 123,Number("011") 返回 11 (忽略前面的零)。
2、如果字符串包含有效的浮点值格式如 "1.1",则会转换为相应的浮点值(同样,忽略前面的零)。
3、如果字符串包含有效的十六进制格式如 "0xf",则会转换为与该十六进制对应的十进制整数值。
4、如果是空字符串(不包含字符),则返回 0 。
5、如果字符串包含除上述情况之外的其他字符,则返回 NaN 。
对象:调用 valueOf() 方法,并按照上述规则转换返回的值。如果转换结果是 NaN,则调用 toString() 方法,再按照转换字符串的规则转换。