相信刚接触JS的人都会被他的想等性判断给整糊涂,看看下面代码,你能答对几个?
NaN === NaN // false NaN == NaN // false Object.is(NaN, NaN) // true 0 == false // true 1 == true // true Number(null) === 0 // true null == 0 // false
Javascript提供了三种不同的值比较操作,分别是严格相等、宽松相等、以及Object.is,希望看完下面的内容,能够彻底弄清楚他的判断逻辑。
1. 严格相等 x === y判断逻辑
1、如果x的数据类型和y的数据类型不相同,返回false;
2、如果x是Number类型
3、其他类型参照SameValueNonNumber(x, y)
NaN === NaN // false undefined === undefined // true null === null // true undefined === null // false
2. 宽松相等 x == y
12 == '0xc' // true, 0xc是16进制 12 == '12' // true 12 == '12c' // false, 说明ToNumber转换是用的Number()方法
注意:
Number(null) === 0 但是 null == 0 // false,
2.1 ToNumber将一个值转换为数值类型
详情参考数值类型转换
如果是boolean类型, true返回1,false返回0; 如果是数值,只是简单的传入返回; 如果是null,返回0 如果是undefined, 返回NaN; 如果是字符串,字符串如果只包含数字,则将其转换成十进制数;如果是有效的浮点格式,将其转换成对应的浮点数值;如果是二进制或十六进制将其转换成对应的十进制数值; 如果是对象,调用对象的valueOf()方法,然后依照前面规则转换,如果valueOf返回值是NaN,则调用toString()方法,再依照前面的规则转换返回的字符串2.2 ToPrimitive
toPrimitive(A)通过尝试调用 A 的A.toString() 和 A.valueOf() 方法,将参数 A 转换为原始值(Primitive);
JS中原始类型有:Number、String、Boolean、Null、Undefined;
不同类型对象的valueOf()方法的返回值:
对象 | 返回值 |
---|---|
Array | 返回数组对象本身。 |
Boolean | 布尔值 |
Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC |
Function | 函数本身 |
Number | 数字值 |
Object | 对象本身。这是默认情况, 可以覆盖自定义对象的valueOf方法 |
String | 字符串值 |