A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小江哥 黑马粉丝团   /  2019-6-17 18:37  /  768 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        基本数据类型(Undefined,Null,Boolean,Number和String)
        他们的值在内存中占据着固定大小的空间,并被保存在栈内存中。当一个变量向另一个变量复制基本类型的值,会创建这个值的副本,并且我们不能给基本数据类型的值添加属性

        var x = 1;
        var y = x;
        x.name = 'aaa';
        console.log(x);//1
        console.log(y); //1
        console.log(x.name); //undefined



        复制数据类型
        复杂的数据类型即是引用类型,它的值是对象,保存在堆内存中,引用类型值的变量实际上包含的不是对象本身,而是一个指向该对象的指针。
        从一个变量向另一个变量复制引用类型的值,复制的其实是指针地址而已,因此两个变量最终都指向同一个对象



        浅拷贝



        var obj = {
            name:'zhangsan',
            age: 22
        }
        var obj2 = obj;
        obj2['c'] = 5;
        console.log(obj);  
        console.log(obj2);


        var arr = [1, 2, 3, 4];
        var arr2 = arr;
        arr2[1] = "aaa";
        console.log(arr);
        console.log(arr2);


--------------------------------------------------------------------------


        深拷贝
        数组

        arr1=[1,2,3,4,5]
        arr2=[]
        function deepCopy(arr1, arr2) {
            for (var i = 0; i < arr1.length; i++) {
                arr2[i] = arr1[i];
            }
        }
        deepCopy(arr1,arr2)
        arr2[0]= 111
        console.log(arr1)
        console.log(arr2)



        //1.slice()

        var arr = ['a', 'b', 'c'];
        var arrCopy = arr.slice(0);
        arrCopy[0] = 'aaa'
        console.log(arr); // ["a", "b", "c"]
        console.log(arrCopy); // ["aaa", "b", "c"]

        //2.concat()

        var arr = ['a', 'b', 'c'];
        var arrCopy = arr.concat();
        arrCopy[0] = 'test'
        console.log(arr); // ["a", "b", "c"]
        console.log(arrCopy); // ["test", "b", "c"]




        对象

        var obj = {
            name:'zhangsan',
            age: 22
        }
        var obj2 = new Object;
        obj2.name = obj.name;
        obj2.age = obj.age

        obj.name = 'lisi';
        console.log(obj);
        console.log(obj2);


        var obj = {
            name: 'aaa',
            age: 22
        }

        var a = [111,222,333]

        function copy(oldObj){
            let newObj = {};
            if (oldObj instanceof Array){
                newObj = [];
            };
            for (let key in oldObj){
                let value = oldObj[key];
                if (typeof value === "object" && value !== null){//如果原对象的某个属性是复制数据类型,递归调用copy
                    newObj[key] = copy(value);
                } else{//如果原对象的某个属性是基本数据类型,直接将此属性赋值给新对象的相应属性
                    newObj[key] = value;
                }
            };
            return newObj;
    }
        var objCopy = copy(obj)
        obj.name = 'bbb';
        console.log(obj);
        console.log(objCopy);

        var b = copy(a)
        console.log(b)


        // 使用JSON.stringify()和JSON.parse()也可以实现深拷贝。当值为undefined、任意函数、symbol时会被忽略。
        var obj = {
            a: 1,
            b: 2,
            fn:function(){
                console.log(1)
            }
        }
        let newobj = JSON.parse(JSON.stringify(obj));
        newobj.a = 3
        console.log(obj)
        console.log(newobj)





        es6 assign()  Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。

        var obj = {
            a: 1,
            b: 2,
            c:{
                d:1
            }
        }

        var obj2 = Object.assign({},obj)
        // obj2.a = 111
        obj2.c.d = 111

        console.log(obj)
        console.log(obj2)

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马