区别 == 和 === && 类型转化(隐式调用)---穿插来分析.
// == 相等,比较的值
// === 全等,比较类型还比较值
undefined、NaN、0、null和空字符串'',false 均被视为false
// 数字 字符串 布尔 undefined null
// 0 "" false undefined null NaN(非正常值 )
// 除上述以外的其它情况一律被视作true
// "5" == 5 // true
// "5" === 5 // false
// console.log(false == 1); // false
// console.log(false == [1]); // false
// 相等比较规则:(一条条从上到下的去匹配规则,匹配到那一条应用那一条规则)
// 1. NaN 与任何值不相等,包括NaN自己本身
// 2. null 与任何值不相等,除了null和undefined
// 3. undefined 与任何值不相等,除了null和undefined
// 4. 如果操作数有布尔类型或者是数字,把操作数都转成数值进行比较
// 5. 如果操作数有一个是字符串,把操作数都转成字符串进行比较
// 6. 如果操作数两边都是复杂数据类型,比较的是地址
// console.log("5" == 5); // +"5"
// console.log(false == 1); // +false ==> 0
// console.log(false == "1"); // 0 == 1 ===> false
// console.log(false == "0"); // true
// console.log(false == null); // false
// console.log(false == undefined); // false
// console.log(null == 0);
// console.log(null == false);
// console.log(null == undefined);
// console.log(null === undefined); // false
// console.log(undefined == 0);
// console.log(undefined == "");
// console.log(NaN == 0);
// console.log(NaN == NaN);
// console.log({} == {}); // false
// console.log([]==[]); // false
// console.log(undefined == null);
// console.log([] == ![]); // true
// console.log([] == false); // +[] ==> 0 +false ==> 0 0 == 0
// !运算符的优先级要高于比较运算符
// ! 取反
// [] 布尔类型 true {} true "123" "0"
// ![] ==> false
// 如何快速的转换布尔类型 !! 转成布尔类型
// ! 就是取反的作用
// console.log({}==!{}); // false
// 先进行右边一元运算符: !{} => false,,,看规则第四条,false => 0
// 看左边 {} = 浏览器隐式去调用valueOf(),想转成基本数据类型,但是还是{},然后又去调用toString(),
// 对象.toString() => "[object Object]"
例1:
// var obj = {};
// console.log(obj.toString()); // "[objectObject]"
例2:
// var a = {},
// b = {key: 'b'};
// c = {key: 'c'};
// a[b] = 123;
// a[c] = 456;
// console.log(a[b]); //456
// 小结:
// 1. 相等 全等的区别
// 2. 相等的比较规则
// 1. NaN
// 2. null
// 3. undefined
// 4. 有一个是布尔、数字 ==> 都转成数字
// 5. 有一个字符串 ==> 都转成字符串
// 6. 都是复杂数据类型, ==> 地址
//1. NaN : not a number
//2. 这其实是一个错误的转化方法, 浏览器宽容,不给报错 , NaN
//3. NaN 是一个number类型
//4. NaN 它六亲不认,不等于任何值,包括它自己
//5. isNaN 判断一个值的内容是不是数字 (内容 '3' 3)
// 如果内容是一个数字 => false
console.log( isNaN(3) ); //false
console.log( isNaN('4') ); //false
console.log( isNaN('abc')); //true
思考:
// console.log({}==![]);
// console.log(![]=={});
// console.log([]==!{});