区别==和===、相等比较(隐式转化)

468 阅读2分钟
    区别 == 和 === && 类型转化(隐式调用)---穿插来分析.
    
    // ==  相等,比较的值
    // === 全等,比较类型还比较值
    
    
    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([]==!{});