// 规律:对象 --> 字符串 --> **数值** <-- 布尔
//不同类型的==:
// 一个值是bool,比较前,false转成0, true转成1
// 一个值是字符串,另一个是数字,比较前字符串转成数字
// 一个值是对象,另一个不是,则调用对象的valueOf方法,用得到的基本类型值按照上面的两条规则比较
// null和undefined是相等的
// 比较相等之前,null和undefined不能转换成其他任何值
// NaN和任何值都不相等,包括NaN
// 如果两个操作数都是对象,则比较他们是否指向同一个对象,是就true,否就false
// 隐式转换:
// 1.转成string类型: +(字符串连接符)
// 字符串连接符与算术运算符隐式转换规则混淆
console.log(1+"true");//1true
// 2.转成number类型:
// ++/--(自增自减运算符)
// + - * / %(算术运算符)
// > < >= <= == != === !=== (关系运算符)
// 3. 转成boolean类型:!(逻辑非运算符)
// 关系运算符:会把其他数据类型转换成number之后再比较关系
console.log(1+true);//2
console.log(1+null);//1
console.log(1+undefined);//NaN
console.log("2">10);//false
// 当关系运算符两边有一边是字符型时,会将其他数据类型使用Number()转换,再比较
// Number("2")>10---> 2>10 --->false
console.log("2">"10");//true
// 当关系运算符两边都是字符型时,同时转为Number(),但会使用字符串的unicode编码转为数字。charCodeAt()
// "2".charCodeAt()>"10".charCodeAt()--->50>49---->true
console.log("abc">"b");//false
// "abc">"b"--->"a".charCodeAt()>"b".charCodeAt()---> 97>98 --->false
console.log("abc">"aad");//true
// "abc">"aad"--->"b".charCodeAt()>"a".charCodeAt()---> 98>97 --->true
// []的toString()方法会得到""
*********
重点记忆:
console.log(Boolean([]));//true
console.log(Boolean({
}));//true
// 大坑
console.log([]==0);//true
// [].toString()==0--->""==0--->0==0--->true
console.log(![]==0);//true
//![]==0--->Boolean(![])==0--->false==0--->0==0--->true
// 神坑
// 如果两个操作数都是对象,则比较他们是否指向同一个对象,是就true,否就false
console.log([]==[]);//false
console.log([]==![]);//false x true
// []==false--->[]==0--->[].toString()==0--->""==0--->0==0
console.log(([])?true:false);//true
console.log(([]==false?true:false));//falsex true
// []==0--->[].toString()==0--->""==0--->0==0
// 而{}的toString()方法会得到字符串`[object Object]`
// 史级神坑
console.log({
}=={
});//false
console.log({
}==!{
});//false
// {}==!{}--->{}==false--->{}==0--->{}.toString()==0--->[object Object]==0--->false
console.log(({
}==false)?true:false);//false
// {}==false--->{}==0--->{}.toString()==0--->[object Object]==0--->false
let a=[];
let b="0";
console.log(a==0);//falsex true
// []==0--->[].toString()==0--->""==0--->0==0--->true
console.log(a==!a);//falsex true
// []==![]--->[]==false--->[]==0--->[].toString==0--->""==0--->0==0--->true
console.log(b==0);//true
// "0"==0--->Number("0")==0--->0==0--->true
console.log(a==b);//false
// []=="0"--->[].toString()=="0"--->""=="0"--->false
console.log(a=="");//true
//特殊情况,无规则
console.log(NaN==NaN);//false
console.log(null==undefined);//true
console.log(undefined==undefined);//true
console.log(null==0);//false
console.log(undefined==0);//false