大家都知道数组和对象都是引用值,引用值不能直接赋值,直接赋值会导致指针指向问题
所以如何复制引用值?
function clone( target, origin ){
var target = target || {};
for (var prop in origin){
target[prop] = origin[prop];
}
return target;
}
用这种方法就可以实现引用值的克隆或复制,但是这种方法仍然有一个问题,就是当属性值是引用值时就没法完成克隆,所以,还需要更深层次的克隆。
function clone( target, origin ){
var target = target || {};
for (var prop in origin){
if ( origin[prop]!== null && typeof(origin[prop]) === "object" ){
if(Object.prototype.toString.call(origin[prop]) === "[object Array]"){
target[prop] = [];
}else{
target[prop] = {};
}
clone(target[prop],origin[prop]);
}else{
target[prop] = origin[prop];
}
}
return target;
}
关于数组和对象的克隆js还提供了一些其他的已经封装好的方法:
- Array.from(arr或obj); Array.from()可以实现数组或对象的复制,生成一个新数组
- ES6提供的扩展运算符也可以实现数组或对象的复制(之前扩展运算符只能用在数组身上,后来ES2018又满足了对象的复制)。
- 使用Array.prototype.slice.call(arr); //这个方法只能实现将数组复制