js if else return不管用_js浅拷贝深拷贝

// implements Object.assign
// fix `Cannot resolve module 'babel-runtime/core-js/object/assign'`
export function assign(dest, ...srcs) {
  srcs.reverse().forEach(src => {
    for (const k in src) {
      if (src.hasOwnProperty(k)) {
        dest[k] = src[k]
      }
    }
  })
  return dest
}

// detail: https://www.zhihu.com/question/23031215
// about deepCopy: http://jerryzou.com/posts/dive-into-deep-clone-in-javascript/
export function deepClone(obj) {
  let str
  let newobj = obj.constructor === Array ? [] : {}
  if (typeof obj !== 'object') {
    return
  } else if (window.JSON) {
    str = JSON.stringify(obj) // 系列化对象
    newobj = JSON.parse(str) // 还原
  } else {
    for (let i in obj) {
      newobj[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]
    }
  }
  return newobj
}

更好的实现可看这篇文章:

【进阶4-3期】面试题之如何实现一个深拷贝 - 掘金​juejin.im

JSON.parse深拷贝

先将一个对象转为json对象。然后再解析这个json对象

let obj = {a:{b:22}};
let copy = JSON.parse(JSON.stringify(obj));
  • 优点: 代码写起来比较简单
  • 缺点:你先是创建一个临时的,可能很大的字符串,只是为了把它重新放回解析器。另一个缺点是这种方法不能处理循环对象 , 如下面的循环对象用这种方法的时候会抛出异常;
  • 诸如 Map, Set, RegExp, Date, ArrayBuffer 和其他内置类型在进行序列化时会丢失。
let a = {};
let b = {a};
a.b = b;
let copy = JSON.parse(JSON.stringify(a));

b7ca0771a0ba4cc7b9334d3e4923acdb.png

70c8be045783592bd5c6f2a9d9c74cf3.png
var a = [
    1,
    function(){ /*..*/ },
    2,
    function(){ /*..*/ }
];
JSON.stringify( a ); // "[1,null,2,null]"
JSON.stringify( a, function(key,val){
    if (typeof val == "function") {
        // 函数的ToBoolean强制类型转换
        return !!val;
    }
    else {
        return val;
    }
} );
// "[1,true,2,true]"

SON.stringify(..) 在对象中遇到值为 undefined、function 和 symbol 时会自动将这个字段忽略,在数组中则会返回 null(以保证单元位置不变)。

可以通过第二个参数将函数转换为其它可显示的内容

lodash深拷贝

https://github.com/lodash/lodash/blob/master/cloneDeep.js​github.com

示例:

5b5cdea8fd8034a2e78c374d0032cbe4.png

注意option的深度, 因为 Object.assign或者lodash._assign是浅拷贝, text拷贝不到。

1528873ca2a1437b5bbd4f6ce72b07ce.png

e4d3bebbbe27b9c1093e5422767c644e.png

而我们结构转换图表中的标题是依赖 title.text传入的,所以这里肯定会报错.

参考:

javascript中的深拷贝和浅拷贝?​www.zhihu.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值