js拷贝

46 阅读1分钟

基础方法--存在一些问题

  • 1、环引用题;
  • 2、没有兼容复杂类型(Date、RegExp、Set、Map)
function deepClone(resource) {
  if (typeof resource === "object") {
    var res = resource instanceof Array ? [] : {};

    for (var i in resource) {
      res[i] =
        typeof resource[i] === "object" ? deepClone(resource[i]) : resource[i];
    }

    return res;
  } else {
    return resource;
  }
}

浅拷贝的方法

Object.assign(target, resource)

... 扩展运算符

数组拷贝 Array.slice()

深拷贝的方法

JSON.parse(JSON.stringify(resource))

  • function、undefined、symbol 将消失;
  • 对象中含有 NaN、Infinity 以及 -Infinity,JSON 序列化的结果会变成 null;
  • 拷贝 Date 引用类型会变成字符串;
  • 拷贝 RegExp 引用类型会变成空对象;
  • 无法拷贝对象的循环应用,即对象成环 (obj[key] = obj);
  • 无法拷贝不可枚举的属性;
  • 无法拷贝对象的原型链;

lodash 库