由于面试中问到了一些深拷贝中的问题,这里总结一下。
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"