浅拷贝和深拷贝

浅拷贝:浅克隆之因此被称为浅克隆,是由于对象只会被克隆最外部的一层,至于更深层的对象,则依然是经过引用指向同一块堆内存.数组

1.第一种方法:bash

function shadowClone(o) {
  const obj = {};
  for (let i in o) { 
   obj[i] = o[i];
  }
  return obj;
}
var oldObj = {
   a: 1,
   b: 3,
   c: [1, 3, 5, 7, 9]
};
var newObj = shadowClone(oldObj);复制代码

第二种:函数

var oldObj = {
   a: 1,
   b: 3,
   c: [1, 3, 5, 7, 9]
};
var newObj1 = Object.assign({}, oldObj);复制代码

深拷贝ui

深拷贝: 建立一个新的对象和数组,将原对象的各项属性的“值”(数组的全部元素)拷贝过来,是“值”而不是“引用”
spa


// 深拷贝    // 获取类型    
function getType(obj) {
      var toString = Object.prototype.toString;
      var map = {
        '[object Boolean]': 'boolean',
        '[object Number]': 'number',
        '[object String]': 'string',
        '[object Null]': 'null',
        '[object Undefined]': 'undefined',
        '[object Array]': 'array',
        '[object Function]': 'function',
        '[object RegExp]': 'regExp',
        '[object Date]': 'date',
        '[object Object]': 'object'
      }
      if (obj instanceof Element) { 
// 由于对不一样标签,toString会返回对应不一样标签的构造函数
        return 'element';
      }
      return map[toString.call(obj)];
    }
    function deepClone(data) {
      var type = getType(data)
      var obj;
      if (type === 'array') {
       obj = []
        for (var i = 0; i < data.length; i++) {
          obj.push(deepClone(data[i]))
        }
      } else if (type === 'object') {
        obj = {}
        for (var key in data) {
          obj[key] = deepClone(data[key]);
        }
      } else {
        obj = data;
      }
      return obj;
    }
    var oldObj = {
      a: 1,
      b: 2
    }
    const newObj = deepClone(oldObj);
    const newObj1 = newObj.c = 4;
    console.log(oldObj, newObj)
    let oldData = [1, 2, 3, 4, 4];
    const newData = deepClone(oldData);
    const newData1 = newData.push({ a: 4, b: 7 });
    console.log(newData, '--->newData', oldData, '---->oldData');复制代码
相关文章
相关标签/搜索