额,js深复制

✤ 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"}