js深入系列八(==与===)

222 阅读2分钟

参考文章

一些常见的例子

var str1 = '1';
var str2 = new String('1');
console.log(str1 == str2); // true
console.log(str1 === str2); // false

console.log(NaN == NaN); // false
console.log(NaN === NaN); // false

console.log({} == {}); // false
console.log({} === {}); // false

console.log(null == undefined);         //true
console.log([10] == 10);                //true
console.log('10' == 10);                //true
console.log([] == 0);                   //true
console.log(true == 1);                 //true
console.log([] == false);               //true
console.log(![] == false);              //true
console.log('' == 0);                   //true
console.log('' == false);               //true
console.log(null == false);             //false
console.log(!null == true);             //true

1. === 严格相等,会比较两个值的类型和值

1.1 Strict Equality Comparison

  • 如果Type(x)和Type(y)不同,返回false
  • 如果Type(x)和Type(y)相同
    • 如果Type(x)是Undefined,返回true

    • 如果Type(x)是Null,返回true

    • 如果Type(x)是String,当且仅当x,y字符序列完全相同(长度相同,每个位置上的字符也相同)时返回true,否则返回false

    • 如果Type(x)是Boolean,如果x,y都是true或x,y都是false返回true,否则返回false

    • 如果Type(x)是Symbol,如果x,y是相同的Symbol值,返回true,否则返回false

    • 如果Type(x)是Number类型:

      如果x是NaN,返回false

      如果y是NaN,返回false

      如果x的数字值和y相等,返回true

      如果x是+0,y是-0,返回true

      如果x是-0,y是+0,返回true

      其他返回false

2. == 抽象相等,比较时,会先进行类型转换,然后再比较值

  • 如果Type(x)和Type(y)相同,返回x===y的结果
  • 如果Type(x)和Type(y)不同
    • 如果x是null,y是undefined,返回true
    • 如果x是undefined,y是null,返回true
    • 如果Type(x)是Number,Type(y)是String,返回 x==ToNumber(y) 的结果
    • 如果Type(x)是String,Type(y)是Number,返回 ToNumber(x)==y 的结果
    • 如果Type(x)是Boolean,返回 ToNumber(x)==y 的结果
    • 如果Type(y)是Boolean,返回 x==ToNumber(y) 的结果
    • 如果Type(x)是String或Number或Symbol中的一种并且Type(y)是Object,返回 x==ToPrimitive(y) 的结果
    • 如果Type(x)是Object并且Type(y)是String或Number或Symbol中的一种,返回 ToPrimitive(x)==y 的结果
    • 其他返回false

待更...