✤ Jan 26, 2015 ✤
好吧,最近做页面的时候被js深深的坑到了。
当我轻松的用var a = b
的时候,由于b是一个对象,并且在这之后我对b进行了修改,然后自然而然的悲剧了,a也一起改变了。虽然,我很快的想到了这是由于我用了浅复制造成了。于是,我开始百度深复制的方法。
b是一个array所以我自然而然的用了var a = b.slice(0)
。然后我满怀信心的run了我的程序,然后又一次悲剧了QAQ
我意识到,由于我b中的每个元素,仍有可能是一个对象,造成其实它里面每个对象元素还是浅复制。(๑•́ ₃ •̀)
嗯,so,我不得不用递归来复制元素了,然后我懒得写了,就抄袭了一个[代码抄袭自],js你赢了(= =)
function deepCopy(srcObject) {
var newObject
if (srcObject instanceof Array) {
newObject = []
for (var i = 0; i < srcObject.length; i++) {
newObject[i] = deepCopy(srcObject[i])
}
return newObject
}else if (srcObject instanceof Object) {
newObject = {}
for (var j in srcObject) {
newObject[j] = deepCopy(srcObject[j])
}
return newObject
}else {
return srcObject
}
}
这是一个对比的例子~(我是在qml中用的js)
function test() {
var a = ['1',{"aaa":"qqq"},'3']
var b = deepCopy(a)
var c = a.slice(0)
a[1]["12"]="444"
console.log(JSON.stringify(a[1]))
console.log(JSON.stringify(b[1]))
console.log(JSON.stringify(c[1]))
}
输出
qml: {"12":"444","aaa":"qqq"}
qml: {"aaa":"qqq"}
qml: {"12":"444","aaa":"qqq"}