两者都是判断等式两边是否相等,最大的区别就是==会进行类型的转换之后再判断两者是否相等,而===不会进行数据类型的转换,先判断两边的数据类型是否相等,如果数据类型相等的话才会进行接下来的判断,再进行等式两边值得判断,可以理解为只有等式两边是全等(数据类型相同,值相同)的时候结果才会是true,否则全为false。
==判断等式两边是否相等的情况:
(1)null、undefined和不同类型比较,都是false(null和undefined结果为true)
(2)NaN和任何数据进行比较,都是false(包括NaN和NaN相比较也为false)
(3)布尔值是转换为数字1或0再和其他数据进行比较
拓展: 不同数据转换成布尔值的结果:
console.log(Boolean('')); //false
console.log(Boolean({})); //true
console.log(Boolean([])); //true
console.log(Boolean(null)); //false
console.log(Boolean(undefined)); //false
console.log(Boolean(NaN)); //false
console.log(Boolean(Object)); //true
(4)数字和其他简单数据类型进行比较时,会尝试将其他数据类型转换成数值型再进行比较
**其他数据类型默认转数字使用的是Number()
console.log(""==false); //true
console.log(parseInt("")); //NaN
console.log(Number("")); //0
console.log(""==0); //true
(5)对象和其他简单数据类型进行比较的时候,会尝试使用对象的valueOf()和toString()方法将对象转换为原始值进行比较:
①对象.toString()返回值只有[ object Object ]
let obj = {
name:'leon',
age:18
};
console.log(obj.toString()); //[object Object]
console.log(obj.valueOf()); //{name: 'leon', age: 18}
let obj = {};
console.log(obj.toString()); //[object Object]
console.log(obj.valueOf()); //{}
②数组 [ ].toString()返回值是空 其他数组.toString()返回值是字符 ,一个成员一个字符逗号分隔
let arr1=[1,2,3];
console.log(arr1.toString()); //1,2,3
console.log(arr1.valueOf()); //[1, 2, 3]
let arr=[];
console.log(arr.toString()); //空
console.log(arr.valueOf()); //[]
③其他的对象function reg 返回字符串
function fn(){
console.log("你是最棒的!");
}
console.log(fn.toString());
console.log(fn.valueOf());
let reg = /^[^_$]\w{5,}@(163|126|qq|sina)\.(com|cn|net)$/;
console.log(reg.toString());
console.log(reg.valueOf());
运行结果截图:
(6)两者同为引用类型时,必须是指向同一个引用地址才相等,否则不相等
(7)-0 == +0 结果为:true
全等比较(===)不转换数据类型,数据类型和内容必须完全一致才是相等
全等比较(===)两边是否相等的情况:
(1)类型不同,一定不相等
(2)两个同为数值,并且相等,则相等;若其中一个为NaN,一定不相等
(3)两个都为字符串,每个位置的字符都一样,则相等
(4)两个同为true,或是false,则相等
(5)两个值都引用同一个对象或函数,则相等,否则不相等(引用类型地址空间可能不一样)
(6)两个值都为null,或undefined,则相等
(7*)两者同为引用类型时,必须是指向同一个引用地址才相等,否则不相等(5的补充)
(8)-0 === +0 结果为:true