比较远算符(== 和 ===)

423 阅读2分钟

===

严格全等,不会类型转换,必须要数据类型和值完全一致,类型不同就不相等。

  • 基本数据类型

    1. Number, String, Boolean, null 和 undefined 两边的值要一样, 才相等;
    2. NaN === NaN // false; NaN不会等于任何数据,包括自己。
  • 引用数据类型

Object, Array, Function 如果两边的引用地址一样则是相等的。

==

非严格相等,会先进行类型转换,在进行值的比较。

  • 两边是undefined或null,返回true
console.log (null == undefined); // true
console.log (null == null); // true
console.log (undefined == undefined); // true
  • 两边是String,Boolean,Number其中一种

会将不是Number类型的数据转成Number类型,true转为1, false转为0。Number()会将非数值型字符串结果为NaN。

console.log (1 == true); // true  Number(true)的结果为1
console.log ( 1 == "true" ); // false  Number()会将非数值型字符串结果为NaN,数值型字符串为数值,空字符串为0;
console.log ( 1 == !"true" ); // false  !先将"true"转为布尔型false Number(false)的结果为0
console.log ( 0 == !"true" ); // true
console.log(true == 'true') // false
  • 只要有一边是NaN则返回false
console.log ( NaN == NaN ); //false
  • 只有一边为引用类型

获取引用类型数据的原始值之后再比较;先调用valueOf方法,然后调用toString方法,valueOf:一般默认返回自身,数组的toString:默认会调用join方法拼接每个元素并且返回拼接后的字符串。

// 空数组的toString()方法会得到空字符串,而空对象的toString()方法会得到字符串[object Object]
console.log ([].toString ()); // 空字符串
console.log ({}.toString ()); // '[object Object]'

console.log ([1, 2, 3].valueOf().toString()); // '1,2,3'
console.log ([1, 2, 3] == "1,2,3" ); //true  (1)[1,2,3].toString() == '1,2,3'  (2)'1,2,3' == '1,2,3'
console.log({} == '[object Object]'); //true
  • 两边都是引用类型

只比较引用地址,如果地址一致则返回true,否则返回false.

exercise

== 是非严格比较操作符,false会转换为0,[]会转换成'',{}会转换为"[object Object]",所以会输出1,不输出2,[]和{}是“空”的对象,不是“空”,所以会输出3,最后一个引用地址不一致,不是同一个对象,所以不会输出4;

// 输出1,3
if([] == false) { console.log(1) }; // false会转换为0,[]会转换成'',空字符串转为Number型后为0。
if({} == false) { console.log(2) }; // {}会转换为"[object Object]" 所以不会等于false
if([]) { console.log(3) }; // 空对象和空数组转为Bollean类型都是true
if([1] == [1]){ console.log(4) }; // 两个引用类型的数据的引用地址不同