js值类型和引用类型

2019-06-04  本文已影响0人  pretty_rain

1.值类型

存储在栈区的数据,无法添加、删除属性,如果直接赋值给另一个变量,两个变量互不影响,修改其中任意一个变量的值,都对另一个变量的值无影响。

    var num = 1;
    var ab = num.toFixed(2);
    var str = '1111';
    var un = undefined;
    console.log(ab)
    console.log(toString.call(num));
    console.log(toString.call(str));
    console.log(toString.call(un));
    console.log(toString.call(true));

2.引用类型

引用类型的值储存再堆区,再栈区数据的引用地址。如果直接赋值给另一个变量,其实是把数据的存放地址拷贝给了另一个变量, 共享一个地址,共用一份数据,任何一方更改数据,都会导致另一方数据发生改变

    var arr = [];
    var data = {};
    var nul = null;
    function Product(){}
    var product = new Product();
    console.log(toString.call(product));
    var num = new Number(10);
    console.log(toString.call(num));

3.引用类型的深拷贝和浅拷贝

<script>
    /*浅拷贝*/
    var a = {
        name :  "xiaoming",
        data :{
            age:2,
            sex:"男"
        }
    }
    var b = {};
    qian(a,b);
    function qian(a,b){
        for(var i in a){
            b[i] = a[i];
        }
    }
    console.log(b.name);
    console.log(b.data.age);
    a.name="xiaohua";
    a.data.age=3;
    console.log(b.name);
    console.log(b.data.age);
    console.log("---------------------------------------")
    /*深拷贝*/
    var c = {
        name :  "xiaoming",
        data :{
            age:2,
            sex:"男"
        }
    }
    var d = {};
    shen(c,d);
    function shen(c,d){
        for(var i in c){
            if(toString.call(c[i])=="object Object"){
                 shen(c[i],d[i]);
            }else {
                d[i]=c[i];
            }
        }
    }
    console.log(d.name);
    console.log(d.data.age);
    a.name="xiaohua";
    a.data.age=3;
    console.log(d.name);
    console.log(d.data.age);
</script>

4.关于引用类型赋值题

<script>
    var a = {"x": 1};
    var b = a;
    a.x = 2;
    console.log(b.x);  //2
    /*解析*/
    /*将a赋值给b b中保存的只是地址,也就是a变量,b变量指向同一个对象*/
    /*修改a.x 同时也修改了b.x - 以为修改的都是同一块内存区域*/
    
    a = {"x":3};
    console.log(b.x);
    /*解析*/
    /*这里又定义了一个新的对象,重新分配内存空间,这个时候a变量中存储的是新地址,而b还是指向老对象*/
    /*所以这里b.x还是2*/
    
    a.x = 4;
    console.log(b.x);
    /*解析*/
    /*a b这个时候分别指向不同的对象,所以修改a不会影响b*/
    /*所以这里b.x还是2*/
</script>
上一篇 下一篇

猜你喜欢

热点阅读