Skip to content

Instantly share code, notes, and snippets.

@DarwinniwraD
Last active May 19, 2017 09:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DarwinniwraD/55a20871b07496a8dd06139d37d95e04 to your computer and use it in GitHub Desktop.
Save DarwinniwraD/55a20871b07496a8dd06139d37d95e04 to your computer and use it in GitHub Desktop.

js复制的集中方法

众所周知,js中复制包括浅复制(Shallow Clone)和深复制(Deep Clone)两种,深复制的出现主要针对复杂数据结构,如数组和对象,其中浅复制就是运用赋值运算方式(“=”),为新对象引用所有的源对象属性,这不会产生新的对象,只是一个对象引用(reference)。而深复制则相对复杂一些,它是将所有的原始数据类型,机器所有的对象引用复制到新的对象中,这种复制最终会形成两个对象.关于两种复制的方法的论述已经有许多了,无外乎有以下三种:

  1. 第三方库,如underscore.js,jquery, loadsh

  2. JSON大法

  3. js原生方法

  4. 关于第三方库的复制方法

  1. jQuery
jQuery.extend( target [, object1 ] [, objectN ] );

详见jQuery extend

  1. loadsh.js

var deep = _.cloneDeep(objects); 详见深度克隆

  1. underscore.js
var y = _.clone(x);
  1. JSON大法
var cloneObj = (JSON.parse(JSON.stringify(originalObj)));

关于以上两类三种方法的可以参考:深入剖析 JavaScript 的深复制(以下简称“深入”)

  1. 原生方法 关于原生方法的写法倒是最有意思的一部分,也是写法最多的一个部分,“深入”一文对此做过讨论.笔者在这里也PO出Sasan Seydnejad写的一种方法:
function clone(deep) {
  var newClonedObj = new this.constructor();
    for (var property in this){
      if (!deep){
        //判断是否需要深复制,如不需要则只进行浅复制
        newClonedObj[property] = this[property];
      }else if (typeof this[property] == 'object'){
        //判断复制源类型,如果复制源是对象,则对其属性进行递归性复制;
        newClonedObj[property] = this[property].clone(deep);
      }else{
        //如果复制源是原始类型,则直接进行赋值复制
        newClonedObj[property] = this[property];
      }
    }
    return newClonedObj;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment