zoukankan      html  css  js  c++  java
  • 250 浅拷贝Object.assign(target, ...sources),深拷贝

    浅拷贝:Object.assign(target, ...sources)。

    **Object.assign()** :方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,它将返回目标对象。
    【lodash:_.cloneDeep(value) 可以实现 深拷贝。】

    <!-- 补充:数组也可以用for ... in -->
    <script>
        var arr = ['pink', 'red', 666]
        for (var k in arr) {
            console.log(k);  // 0  1  2
            console.log(arr[k]);  // pink  red  666
        }
    </script>
    

    <!-- 浅拷贝 -->
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    
    <body>
        <script>
            // 浅拷贝只是拷贝一层, 更深层次对象级别的只拷贝引用.
            // 深拷贝拷贝多层, 每一级别的数据都会拷贝.
            var obj = {
                id: 1,
                name: 'andy',
                msg: {
                    age: 18
                }
            };
    
            console.log(JSON.parse(JSON.stringify(obj))) // // {id: 1, name: "andy", msg: {…}}
    
            var o = {};
    
            for (var k in obj) {
                // k 是属性名   obj[k] 属性值
                o[k] = obj[k];
            }
            console.log(o);  // {id: 1, name: "andy", msg: {…}}
            o.msg.age = 20;
            console.log(obj);  // {id: 1, name: "andy", msg: {…}}
    
            console.log('--------------');
    
            Object.assign(o, obj);
            console.log(o);  // {id: 1, name: "andy", msg: {…}}
            o.msg.age = 20;
            console.log(obj);  // {id: 1, name: "andy", msg: {…}}
        </script>
    </body>
    
    </html>
    

    <!-- 深拷贝 -->
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    
    <body>
        <script>
            // 深拷贝拷贝多层, 每一级别的数据都会拷贝.
            var obj = {
                id: 1,
                name: 'andy',
                msg: {
                    age: 18
                },
                color: ['pink', 'red']
            };
    
            var o = {};
    
            // 封装函数 
            function deepCopy(newobj, oldobj) {
                for (var k in oldobj) {
                    // 判断我们的属性值属于那种数据类型
                    // 1. 获取属性值  oldobj[k]
                    var item = oldobj[k];
                    // 2. 判断这个值是否是数组
                    if (item instanceof Array) {
                        newobj[k] = [];
                        deepCopy(newobj[k], item)
                    } else if (item instanceof Object) {
                        // 3. 判断这个值是否是对象
                        newobj[k] = {};
                        deepCopy(newobj[k], item)
                    } else {
                        // 4. 属于简单数据类型
                        newobj[k] = item;
                    }
                }
            }
            deepCopy(o, obj);
            console.log(o); // {id: 1, name: "andy", msg: {…}, color: Array(2)}
    
            o.msg.age = 20;
            console.log(obj); // {id: 1, name: "andy", msg: {…}, color: Array(2)}
    
            var arr = [];
            console.log(arr instanceof Object); // true
        </script>
    </body>
    
    </html>
    
  • 相关阅读:
    python--异常处理
    Codeforces 1499D
    Codeforces 1263E
    Codeforces 1493D
    Codeforces 1492D
    Codeforces 1490G
    Codeforces 1487E
    Codeforces 1485D
    Codeforces 1485C
    P6917 [ICPC2016 WF]Balanced Diet
  • 原文地址:https://www.cnblogs.com/jianjie/p/12232179.html
Copyright © 2011-2022 走看看