美文网首页工作生活
{}=={},{}==!{}与[]==[],[]==![]

{}=={},{}==!{}与[]==[],[]==![]

作者: 肉肉肉肉_包 | 来源:发表于2019-07-11 15:38 被阅读0次
    var a = function() {console.log(11)}; 
    var b = function() {console.log(11)};
     
    console.log( a==b ); //false
    

    js中基本数据类型和引用数据类型
    基本类型:存放在栈内存中,数据大小确定,内存空间大小可以分配
    引用类型:存放在堆内存中的对象,每个空间大小不一样,根据情况进行特定的分配

    当需要访问引用数据类型时,首先从栈中获取该对象的地址指针,然后再从堆内存中取得所需的数据。
    则console.log( a==b ); 返回false。
    a和b都是保存了指向堆内存中对象的指针,但是是两个对象,只是这两个对象的值相等。
    如果var a = {};var b = a;这时变量b保存的是变量a保存的指针,都指向堆内存的同一个对象,因此a==b返回true。

    var a = [1,2,3,4,5];
    var b = a; 
    var c = a[0];
     
    console.log(b); // [1,2,3,4,5] 
    console.log(c); // 1 
    
    b[4] = 6; 
    c = 7;
     
    console.log(a[4]); //6
    console.log(a[0]); //1
    

    传值和传址的区别。a是数组,属于引用类型,b中存入的是栈中的地址,不是堆内存中的对象。而c中只是获取从a堆内存中获取的一个数值,并保存在栈中,所以b修改的时候,会根据地址到a堆内存中修改,c则直接在栈中修改,并不能修改堆内存中的内容。

    在比较对象的相等性问题时:
    相等和不相等--------先转换再比较(==)
    全等和不全等--------只比较不转换(===)

    console.log( {}=={} ); //false  
    console.log( []==[] ); //false
    

    两个操作值都是对象,比较两个对象是不是同一个对象

    console.log([] == ![]); //true
    

    !操作符会将[]转换为boolean型,再对其求反为false,再进行比较,boolean值转换为0,[]转换为数值0,则相等

    console.log({} == !{}); //false
    
    console.log(Boolean([])) //true
    console.log(Boolean(![])) //false
    console.log([] == ![]) //true
    console.log(Boolean(!{})) //false
    console.log(Number([])) //true
    console.log(Number({})) //NaN
    console.log(Number(!{})) //0
    console.log({} == !{}) //false
    

    比较按照
    (1)如果一个操作值为布尔值,则在比较之前先将其转换为数值
    (2)如果一个操作值为字符串,另一个操作值为数值,则通过Number()函数将字符串转换为数值
    (3)如果一个操作值是对象,另一个不是,则调用对象的valueOf()方法,得到的结果按照前面的规则进行比较
    (4)null与undefined是相等的
    (5)如果一个操作值为NaN,则相等比较返回false
    (6)如果两个操作值都是对象,则比较它们是不是指向同一个对象

    console.log(NaN==undefined); //false
    console.log(null==undefined);//true
    console.log(null==NaN);//false
    

    相关文章

      网友评论

        本文标题:{}=={},{}==!{}与[]==[],[]==![]

        本文链接:https://www.haomeiwen.com/subject/gtathctx.html