私は、次のテストコードがあります。機能が終了すると、我々はそのように結合するにはどうすればよい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
内で実行される関数にオプションを渡す必要があるために必要です。それ以外の場合は、関数を呼び出してオブジェクトとしてパラメータとして渡すことができます。
元のオブジェクトを変更したくない場合は、変更する前に元のオブジェクトのコピーを作成してください。またはコピーを渡す。オブジェクトはポインタで渡されるので、関数内の変更は、オブジェクトのコピーを明示的に変更して元のオブジェクトを変更しない限り、元のオブジェクトに変更されます。 – jfriend00
ポインタとして常に渡されたことを知らなかった。ポインターとして渡されるデータ型のリンクがどこにあるのか知っていますか?この時点では、オブジェクト、配列、クラスのような複雑な変数だけを仮定していますか? – PGT
オブジェクトはポインタとして渡されます。これには、普通のオブジェクト、配列、カスタムオブジェクト( 'typeof obj ===" object "を持つものはすべて、" null "以外のすべてのオブジェクトです)が含まれます。文字列はおそらくポインタによっても渡されますが(内部言語の効率上の理由から)、文字列は不変なので、文字列オブジェクトを変更できないので、コードには関係ありません。数値やブール値などのプリミティブは値渡しされます。 – jfriend00