var list = [0,1,2,3,4,5] //声明一个变量
var b = deepClone(list) //赋值给b
b.splice(0,1) //删除b下面的一个值
console.log(list) //打印list
打印之后显示 list 跟着一起变了。
原因就是 赋值和复制值 的问题。
JS在赋值时,原始类型(比如字符串)是复制值,引用类型(比如关联数组)是复制引用。
引用类型的赋值相当于地址拷贝,赋值前后占用的是同一段地址,js会认为他两是一个东西。
改了b a也跟这边
解决方案:
var list = [0,1,2,3,4,5]
var b = deepClone2(list)
b.splice(0,1)
console.log(b)
console.log(list)
//判定要克隆的对象是不是引用类型,如果是引用类型,则继续迭代,如果该项是基本类型,则直接复制。
function deepClone2(obj){
return JSON.parse(JSON.stringify(obj))
}
在看下打印效果:
完美解决!