zoukankan      html  css  js  c++  java
  • js中的深浅拷贝

    js中的深浅拷贝

    js中有深拷贝、浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数、对象、数组)而言的,大概理解的就是:

    浅拷贝:
        拷贝出的对象c和原始对象o,c和o在key对应的value为引用类型时,其指向同一块内存地址,修改一个必然影响另一个。
    

    举个浅拷贝的例子:

    var shallowCopy = function (src) {
      var dst = {}
      for (const key in src) {
        if (src.hasOwnProperty(key)) {
          dst[key] = src[key];
        }
      }
      return dst
    }
    
    var obj = { a: 1, arr: [2, 3] }
    var shallowObj = shallowCopy(obj)
    console.log(shallowObj) // { a: 1, arr: [ 2, 3 ] }
    
    // 浅拷贝指向同一地址,修改shallowObj的arr则obj.arr也被修改,a属性是值类型不存在该问题
    shallowObj.arr[1] = 5;
    console.log(obj)   // { a: 1, arr: [ 2, 5 ] }
    shallowObj.a = 22
    
    // { a: 1, arr: [ 2, 5 ] } { a: 22, arr: [ 2, 5 ] }
    console.log(obj, shallowObj)   
    
    var obj2 = { a: 1, t: { b: 3, c: 4, d: { e: 6 } } }
    var shallowObj2 = shallowCopy(obj2)
    // { a: 1, t: { b: 3, c: 4, d: { e: 6 } } }
    console.log(shallowObj2)
    
    深拷贝:
        深拷贝出的对象和原对象是完全分开的内存地址,不存在修改一个也修改了另一个的问题。
    

    深拷贝的简单实现:

    var china = {
      nation: '中国',
      birthplaces: ['北京', '上海', '广州'],
      skincolr: 'yellow',
      friends: ['sk', 'ls']
    }
    //深复制,要想达到深复制就需要用递归
    function deepCopy(o, c) {
      var c = c || {}
      for (var i in o) {
        if (typeof o[i] === 'object') {
          //要考虑深复制问题了
          if (o[i].constructor === Array) {
            //这是数组
            c[i] = []
          } else {
            //这是对象
            c[i] = {}
          }
          deepCopy(o[i], c[i])
        } else {
          c[i] = o[i]
        }
      }
      return c
    }
    var result = { name: 'result' }
    result = deepCopy(china, result)
    result.friends.push('slj')
    /**
    { nation: '中国',
      birthplaces: [ '北京', '上海', '广州' ],
      skincolr: 'yellow',
      friends: [ 'sk', 'ls' ] }
    { name: 'result',
      nation: '中国',
      birthplaces: [ '北京', '上海', '广州' ],
      skincolr: 'yellow',
      friends: [ 'sk', 'ls', 'slj' ] }
     */
    console.dir(china)
    console.dir(result)
    

    其次,深拷贝使用JSON.parse(JSON.stringify(src))也可以简单实现,只是该实现破坏了原型链;lodash、jquery提供了相应的工具函数来实现深浅拷贝,就不记录了。

  • 相关阅读:
    cocos2dx3.1从零学习(二)菜单、场景切换、场景传值
    XCode5添加新建类模板(Cocos2dx Template Class for Scene or Layer)
    根据Uri获取图片绝对路径,解决Android4.4以上版本Uri转换
    如何学习 cocos2d-x ?
    Java数据类型中String、Integer、int相互间的转换
    Android各种效果集合
    重新生成IE02
    nvl与 is not null的区别等
    自定义view
    select into from 和 insert into select 的用法和区别(转)
  • 原文地址:https://www.cnblogs.com/vipzhou/p/8697941.html
Copyright © 2011-2022 走看看