1. == 相等 比较的值 会有隐式类型转换
2. === 全等 比较的是值和数据类型。
//console.log(1 == "1"); //true
//console.log(1 === "1"); //false
//console.log(1 == true); //true
//console.log(1 === true); //false
//console.log(null == undefined); //true
//console.log(null === undefined); //false
//console.log(NaN == NaN); //false NaN永远不等于其他的值,包括他自身。
变态面试题1
//console.log([] == ![]); //true
解析
有取反运算,故先算后面的的。
//[] == ![]隐式转换对象,会得到true。
//[] == !true
//[] == false //注意
当一基本类型和一个复杂类型进行比较时会先调用复杂类型的valueOf方法,如果valueOf方法获取的值为空,
会再调用其原型上的toString方法。
//[].valueOf() == false
值还是[],则调用toString方法
//[] == false
//[].toString() == false
console.log([].toString())//"";可检验
console.log(typeof [].toString())//String.
举例说明
//var arr = [];
//console.log(arr + 1); //"1"前面得到一个空字符串
故得到
//"" == false
//false == false
//true
注意点
//如果一个复杂的数据类型和一个基本的数据类型进行运算,会调用这个对象的valueOf方法,取去他的原始值再和这个基本数据类型进行运算.
//如果valueOf取不到一个值,就调用这个对象的toString方法,得到的值再和这个基本数据类型进行运算。
//console.log([].valueOf());
//console.log([].toString());
变态面试题2
console.log({}==!{})//false
解析
//var obj = {};
//console.log(obj.valueOf()); //{}
//console.log(obj.toString()); // "[object Object]"
//console.log(obj + 1); //"[object Object]1"
{}==!{}//对象取反为false.
{}==false//简单类型和复杂类型比较。。
前面的【object object】为真
故表达式为false
详细解析:
//console.log({} == !{}); //false
//{} == !{}
//{} == !true
//{} == false
//{}.valueOf() == false
//{} == false
//{}.toString() == false
//"[object Object]" == false
//true == false
//false