等性运算符
!=:非等号,判断两边的运算数是否不等,只有两个运算符的值不相等时返回true;
==:等号,判断两边的运算数的值是否相等,只根据值进行比较,只有两个运算符相等时才返回true;
===:绝对等于(全等号),判断运算符两边的运算数的值和类型是否都相等,只有值和类型都相等的时候才返回true;
!==:不接对等于(非全等号),判断运算符两边的运算数的值和类型是否不相等,值或类型不相等的时候返回true;
非等号 != 与 等号 ==
!= 和 == 在确定运算数是否相等的时,会进行类型转换
执行的类型转换规则为:
1.如果一个运算数为Boolean值,在检查相等性之前,会将其转换为数值Number型。true转换为1,false转换为0;
2. 如果一个运算数是字符串,一个运算数是数字,在检查相等性之前,要尝试把字符串转换为数值Number型;
3.如果一个运算数是对象,一个运算数是字符串,在检查相等性之前,要尝试把对象转换为字符串String型;
4. 如果一个运算数是对象,一个运算数是数字,在检查相等性之前,要尝试把对象转换为数值Number型;
在比较时,还要遵循以下规则:
1.值null和undefined相等;
2.检查相等性时,不能把 null 和 undefined 转换成其他值;
3.如果某个运算数是 NaN,等号将返回 false,非等号将返回 true;
4.如果两个运算数都是对象,那么比较的是它们的引用值,如果两个运算数指向的是同一个对象,那么返回 true,否则false;
示例:
console.log(5 == 6); //false
console.log(5 == 5); //true
console.log(5 != 5); //false
console.log(5 != 6); //true
console.log(1 == true); //true
console.log(2 == true); //false
console.log(0 == false); //true
console.log('1' == true); //true
console.log('0' == false); //true
console.log('1' == 1); //true
console.log('0' == 0); //true
console.log(undefined == null); //true
console.log(0 == null); //false
console.log(undefined == 0); //false
console.log(5 == NaN); //false
console.log(NaN == NaN); //false
console.log(NaN != NaN); //true
console.log('NaN' == NaN); //false
全等号 == 和 === 非全等号
这两个运算符所做的与等号和非等号大体相同,只是它们在检查相等性前,不执行类型转换。
console.log(5 === 2 + 3); //true
console.log(5 === 6); //false
console.log(5 !== 6); //true
console.log(1 === true); //false
console.log(0 === false); //false
console.log('1' === true); //false
console.log('1' !== true); //true
console.log('1' === 1); //false
console.log('0' !== 0); //true
console.log(undefined === null); //false
console.log(0 === null); //false
console.log(undefined === 0); //false
console.log(5 === NaN); //false
console.log(NaN === NaN); //false
console.log(NaN !== NaN); //true
console.log('NaN' === NaN); //false
注意:
当运算数的类型不同时,等号 == 在进行相等性检查之前要对运算数类型进行转换,而 与 全等号 === 不需要进行类型转换,这是它们最重要的区别,非等号 != 与 非全等号 *!==*也是如此,需要特别注意。