浅克隆

浅克隆之所以被称为浅克隆,是因为对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存.

ES5

数组克隆

限制性比较大,一维数组,deep为1

  1. Array.prototype.clone = function(){
  2. let a=[];
  3. for(let i=0,l=this.length;i<l;i++) {
  4. a.push(this[i]);
  5. }
  6. return a;
  7. }

concat

  1. let arr1 = arr.concat()

slice

  1. let arr2 = arr.slice(0)

ES6(数组,对象通用)

扩展符

  1. let arr3 = [...arr];

assign

  1. let arr3 = Object.assign([],arr);

函数方式实现

  1. function shallowClone(obj) {
  2. let cloneObj = {};
  3. for (let i in obj) {
  4. cloneObj[i] = obj[i];
  5. }
  6. return cloneObj;
  7. }

深克隆(通用)

深克隆与浅克隆的区别就是,浅克隆不会克隆原对象中的引用类型,仅仅拷贝了引用类型的指向。深克隆则拷贝了所有。也就是说深克隆能够做到原对象和新对象之间完全没有影响

JSON

无法对函数,正则等特殊对象进行复制 会抛弃对象的constructor,所有的构造函数会指向Object

  1. JSON.parse(JSON.stringfy(arr))

通用克隆

  1. function deepCopy(obj) {
  2. if (typeof obj === 'object') {
  3. var result = obj.constructor === Array ? [] : {};
  4. for (var i in obj) {
  5. result[i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i];
  6. }
  7. } else {
  8. var result = obj;
  9. }
  10. return result;
  11. }