JS中的相等性判断===, ==, Object.is()
相信刚接触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判断逻辑
- 如果x的数据类型和y的数据类型不相同,返回false;
- 如果x是Number类型
- x是NaN,返回false
- y是NaN,返回false
- x的值和y的值相等,返回true
- x是+0,y是-0,返回true
- x是-0,y是+0,返回true
- 否则返回false
- 其他类型参照SameValueNonNumber(x, y)
- 断言:x,y不是Number类型;
- 断言: x,y的数据类型相同;
- x是undefined, y是undefined return true;
- x是null, y是null,return true;
- x是字符串类型,当且仅当x,y字符序列完全相同时(长度相同,每个位置上的字符也相同)返回true, 否则返回false;
- 如果x是布尔类型,当x,y都为true或者都为false时返回true,否则返回false;
- 如果x是symbol类型,当x,y是相同的symbol值,返回true,否则返回false;
- 如果x,y是同一个对象值,返回true,否则返回false;
NaN === NaN // false undefined === undefined // true null === null // true undefined === null // false
2. 宽松相等 x == y
- 如果x,y的类型相同,返回x===y的结果;
- 如果x是null, y是undefined, 返回true;
- 如果x是undefined, y是null, 返回true;
- 如果x是数值,y是字符串, 返回x == ToNumber(y);
- 如果x是字符串,y是数值, 返回ToNumber(x) == y;
- 如果x是布尔类型, 返回ToNumber(x)==y 的结果;
- 如果y是布尔类型,返回 x==ToNumber(y) 的结果;
- 如果x是String或Number或Symbol中的一种并且Type(y)是Object,返回 x==ToPrimitive(y) 的结果
- 如果Type(x)是Object并且Type(y)是String或Number或Symbol中的一种,返回 ToPrimitive(x)==y 的结果
- 其他返回false
12 == '0xc' // true, 0xc是16进制 12 == '12' // true 12 == '12c' // false, 说明ToNumber转换是用的Number()方法
注意:
Number(null) === 0 但是 null == 0 // false,
2.1 ToNumber将一个值转换为数值类型