implicit conversion valueOf and toString

   // 规律:对象   -->    字符串    -->    **数值**     <--    布尔

    //不同类型的==:
    // 一个值是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

Guess you like

Origin blog.csdn.net/weixin_57780816/article/details/121677128