===
严格全等,不会类型转换,必须要数据类型和值完全一致,类型不同就不相等。
-
基本数据类型
- Number, String, Boolean, null 和 undefined 两边的值要一样, 才相等;
- 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) }; // 两个引用类型的数据的引用地址不同