深拷贝相关问题

由于面试中问到了一些深拷贝中的问题,这里总结一下。

JSON.parse(JSON.stringify(obj))

如果面试官问有什么特别简单实现深拷贝的方法,很多人应该都会答这个,并且也都知道函数是无法拷贝的。

结果回答了之后面试官又问,还有哪个基本类型也是无法拷贝的?这特么还真不知道了,而且我还不怎么用这个来深拷贝。于是我就特意一个一个都试了一遍,发现undefined是不行的。

JSON.parse(JSON.stringify({a: undefined}));
// {}

递归实现深拷贝

说到上面这个问题,还不得不提一下递归实现深拷贝的问题。如果按照下面这样的代码,发现undefined倒是可以拷贝,但是null却不行了。

function func(source) { 
    var target = {}; 
    for (var key in source) { 
        if (Object.prototype.hasOwnProperty.call(source, key)) {
             if (typeof source[key] === 'object') { 
                target[key] = func(source[key]); 
             } else { 
                target[key] = source[key]; 
             }
        } 
    } 
    return target; 
}
var a = { a1: "a1", a2: { b1: "b1", b2: "b2" }, a3: undefined, a4: null, a5: 1 };
var b = func(a); 
console.log(b);
// {a1: "a1", a2: {b1: "b1", b2: "b2"}, a3: undefined, a4: {}, a5: 1}

原因很简单,typeof null返回的是"object"所以还会继续递归,但是null是空对象指针,本身没有任何属性,所以不会进行属性的遍历,最后就返回了一个空对象。但是typeof undefined返回的是"undefined",所以就直接去拷贝而不是继续递归。

typeof null // "object"
typeof undefined // "undefined"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值