首发地址

相信刚接触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类型
    • x是NaN,返回false
    • y是NaN,返回false
    • x的值和y的值相等,返回true
    • x是+0,y是-0,返回true
    • x是-0,y是+0,返回true
    • 否则返回false
  3. 其他类型参照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

  1. 如果x,y的类型相同,返回x===y的结果;
  2. 如果x是null, y是undefined, 返回true;
  3. 如果x是undefined, y是null, 返回true;
  4. 如果x是数值,y是字符串, 返回x == ToNumber(y);
  5. 如果x是字符串,y是数值, 返回ToNumber(x) == y;
  6. 如果x是布尔类型, 返回ToNumber(x)==y 的结果;
  7. 如果y是布尔类型,返回 x==ToNumber(y) 的结果;
  8. 如果x是String或Number或Symbol中的一种并且Type(y)是Object,返回 x==ToPrimitive(y) 的结果
  9. 如果Type(x)是Object并且Type(y)是String或Number或Symbol中的一种,返回 ToPrimitive(x)==y 的结果
  10. 其他返回false
12 == '0xc' // true, 0xc是16进制 12 == '12'  // true 12 == '12c' // false, 说明ToNumber转换是用的Number()方法

注意

Number(null) === 0 但是 null == 0 // false, 

image

2.1 ToNumber将一个值转换为数值类型