2016-04-29 7 views
0

私は、次のテストコードがあります。機能が終了すると、我々はそのように結合するにはどうすればよいoptions.someKey === 'someGROUP.someGroup.hi'async.seriesを使用しているときにnode.jsの元のオブジェクトを変更することを防ぐにはどうすればいいですか?

で終わるときに我々はdoThat()debuggerを押すとoptions.someKey

var async = require('async'); 

var GROUP = 'testGroup'; 

var opts = { 
    someKey: 'hi', 
}; 

test(opts); 

function test(options) { 
    async.series([ 
    doThis.bind(null, options), 
    doThat.bind(null, options), 
    ], function(results) { 
    debugger; 
    }); 
} 

function doThis(options, cb) { 
    options.someKey = [GROUP, options.someKey].join('.'); 
    return cb(); 
} 

function doThat(options, cb) { 
    debugger; 
    options.someKey = [GROUP, options.someKey].join('.'); 
    return cb(); 
} 

はすでにので、値someGROUP.hiを持っています元のオブジェクトは変更されませんか?バインドは、async.series内で実行される関数にオプションを渡す必要があるために必要です。それ以外の場合は、関数を呼び出してオブジェクトとしてパラメータとして渡すことができます。

+0

元のオブジェクトを変更したくない場合は、変更する前に元のオブジェクトのコピーを作成してください。またはコピーを渡す。オブジェクトはポインタで渡されるので、関数内の変更は、オブジェクトのコピーを明示的に変更して元のオブジェクトを変更しない限り、元のオブジェクトに変更されます。 – jfriend00

+0

ポインタとして常に渡されたことを知らなかった。ポインターとして渡されるデータ型のリンクがどこにあるのか知っていますか?この時点では、オブジェクト、配列、クラスのような複雑な変数だけを仮定していますか? – PGT

+0

オブジェクトはポインタとして渡されます。これには、普通のオブジェクト、配列、カスタムオブジェクト( 'typeof obj ===" object "を持つものはすべて、" null "以外のすべてのオブジェクトです)が含まれます。文字列はおそらくポインタによっても渡されますが(内部言語の効率上の理由から)、文字列は不変なので、文字列オブジェクトを変更できないので、コードには関係ありません。数値やブール値などのプリミティブは値渡しされます。 – jfriend00

答えて

0

私はあなたが部分的にあなたのdoThis()doThat()関数にオプションパラメータを適用しないと思うよ、特に適切です。

パラメータと同じjavascriptオブジェクト/リテラル​​を2つの関数に渡してから、そのパラメータを変更します。

このオブジェクトを変更しない場合は、変更しないでください。あなたの操作の結果を返す他の方法を見つける。 doThis()およびdoThat()は、パラメータを変更する代わりに値を返す可能性があります。シリーズがコールされた後、最終的なコールバックでそれらを集めることができます。

optsのイントリアル値をそのまま保存したい場合は、lodashなどを使用してoptsの深いクローンを作成してからテストに渡します。

関連する問題