an odd fellow

仕事のメモ

javascriptでObjectのコピー

javascriptのオブジェクトは関数に渡したり変数に渡したりすると問答無用で参照渡しされます。 仮にオブジェクトにこの値を入れてみて探索したい、といったときに参照渡しということをを忘れているとひどい目に合います。合いました。本当にありがとう。 こういうときどうするかというと、参照渡しされたオブジェクトの要素を走査して、プリミティブ型の値として取り出し、新しいオブジェクトをに突っ込みます。 具体的にはこうです。

    var oldObject = {"a":1, "b":2};
    var newObject = {};
    for(var i in oldObject){
        newObject[i] = oldObject[i];
    }

    newObject["a"] = 100;
    
    console.log(oldObject) => {"a":1, "b":2}
    console.log(newObject) => {"a":100, "b":2}

しかしながらオブジェクトの中にオブジェクトがネストしているようなオブジェクトは多々あります。以上の方法だと例えば

    var oldObject = {"a":1,"b":2 "c":{"d":3,"e":4}};

のようなオブジェクトは結局oldObject["c"]はnewObject["c"]へ参照渡しされてしまいます。調べたところネストされたオブジェクトの確率されたコピー方法がjQueryのextend以外これといったものが無いようでしたので以下のような方法を提唱します。

    var copyObject = function(obj){
        var copy = {};
        for(var i in obj){
            if(typeof obj[i] == "object") copy[i] = copyObject(obj[i]);
            else clone[i] = obj[i];
        }
        return clone;
    };

copyObjectに渡されたオブジェクトが内包するオブジェクトもすべてプリミティブ型まで掘り下げてコピーしてくれます。

JavaScript 第6版

JavaScript 第6版

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス