javascript中==和===的区别

277 阅读2分钟

a === b 全等号

1、a、b若类型不同,返回false;若a、b类型相同,比较a、b的值;
2、如果类型相同,则按照如下的规则进行比较:\

* undefined === undefined;返回true\
* null === null;返回true\
* a、b都是number类型:\
若其中一个值是NaN,则为false,因为NaN无法用来比较\
若两个值相同,返回true\
* a、b都是boolean值或string类型\
'222' === '222';返回true\
false === false;返回true\
* 两个对象(包括array和function),除非是同一个对象(即同一个引用),否则都是false
var a = {}, b = {};
a === b; 返回false

a == b 双等号

1、若a、b类型相同,则使用===进行比较;
2、若a、b类型不同,则先按下列规则进行比较:

  • undefined == null; 返回true\
  • 一个number一个string,将string转换成number类型再比较\
  • 一个boolean,一个非boolean,将boolean转换成number类型再做比较;\
  • 一个string或者number,跟一个object,将object转换成基本数据类型再做比较;
0 == false//true\
1 == true//true\
2 == true//false(true -- > 1 ; 2 != 1)\
2 ? true : false//true\
"" == 0;//true\
"123" == 123;//true\
"" == false//true(false-->0;""-->0;0==0)\
"1" == true//true\
"2" == true//false(true-->1;"2"-->2;2!=1)\
"true" == true//false(true-->1;"true"-->NaN;1!=NaN)\
"2" ? true : false//true(because string is non-empty)\
"abc" == new String("abc")//true(object->string)\

两个比较蛋疼的问题:

1 、(a == 1 && a == 2 && a == 3)可能为true吗?

答:可以的
如果a是一个对象,会先执行valueof方法,如果没有valueof方法,就去执行toString方法;

var a = {
    value: 1,
    valueof() {
        return this.value++;
    }
}
(a==1 && a==2 && a==3) 这时就是true

2、(a === 1 && a === 2 && a === 3) 可能为true吗?

答:可以的
严格相等并没有转化的过程,但我们可以通过某种方式去调用一个函数,在函数里实现想要的功能。Object提供了一个Property函数,特别是getter描述符,所以我们可以这么做:

var value = 0;
Object.defineProperty(window, 'a', {
    getter: function() {
        return this.value++;
    }
})
(a === 1 && a === 2 && a === 3) 这时就是true