2012-05-11 12 views
2

私はJavascript(および一般的なプログラミング)を使い慣れていて、aを使用して任意の数の引数の値を変更する方法を探していました。 Javascript関数。可変数の引数をとり、値を変更してから返すJavascript関数

ここの回答(JavaScript variable number of arguments to function)は非常に役に立ちました。私は必要な機能の2つを作成するためにそれを使用することができましたが、3番目の機能に問題があります。

基本的に、可変数のオブジェクト(プリミティブまたはより複雑な)を関数に渡して、各オブジェクトの値を関数に変更したいとします。

var pants = true; 
var house = true; 
var hair = {/* lots of stuff */}; 

var onFire = function() { 
     for (var i = 0; i < arguments.length; i++) { 
      arguments[i] = false; 
     } 
}; 

onFire(pants, house, hair); 

コンソール出力:

>pants; 
true 

>house; 
true 

>hair; 
Object 

結果があるので、私はこの機能を規定することができる方法:

>pants; 
false 

>house; 
false 

>hair; 
false 

任意の助けいただければ幸いです!

編集:

物事を明確にする - 私が代わりにタイピングのfalseに渡された任意のオブジェクトの値を変更し、再利用可能なヘルパー関数を作成しようとしています:私が使用している場合

var a1 = false; 
var a2 = false; 
... 
var a+n = false; 

mathecの方法 - 同じ名前のグローバル変数をプロパティが上書きするように 'objectをパーズする'ことは可能ですか、それとも毎回明示的に入力することに固執していますか?

var object = { 
    pants: {/* lots of stuff */}, 
    house: {/* lots of stuff */}, 
    hair: {/* lots of stuff */} 
}; 

function modifyObject(obj) { 
    obj.pants = false; 
    obj.house = false; 
    obj.hair = false; 
} 

function someMagic(object){ 
    // wand waves... 
    // rabbit exits hat.... 
} 

コンソール出力:

>pants; 
false 

>house; 
false 

>hair; 
false 

答えて

5

あなたはJavaScriptで変数を渡すと、それはオブジェクトだが、それは(真/偽のような)プリミティブだ場合は、実際の値をコピーしている場合は、値への参照のコピーを渡しています。これは、基本的には、オブジェクトを渡してオブジェクトのプロパティの1つを変更すると、元のオブジェクトを変更することになります。しかし、true/falseのようなプリミティブを渡すと、元の値ではなくコピーが変更されます。したがって、元の値を変更することを目標にする場合は、その値をオブジェクトに格納してオブジェクトを渡すことをお勧めします。例:

任意の数の引数を変更する場合は、true/falseを渡す場合は、それらの値をコピーしていることを覚えておいてください。したがって、関数内でそれらを変更すると、元の値は変更されません。

これは、オブジェクトまたは配列を渡す場合に、実際のオブジェクトを変更している場合に素早く覚えておくことです。それ以外の場合は、コピーを変更しています。

編集

だから、あなたが文字通り何をしたいのか解釈、あなたはこの記述することができます。

var a = true, 
    b = true; 

/* pass in variable names */ 
function makeFalse() { 
    var i, len; 

    for (i = 0, len = arguments.length; i < len; ++i) { 
    window[arguments[i]] = false; 
    } 
} 

makeFalse("a", "b"); 

をしかし、私はこの:-)を行うには十分な理由を考えることはできません。グローバル変数ではなく、フラグと状態変数を格納するために構成オブジェクトを使用します。

+1

良い説明ですが、オブジェクト変数自体を変更することは何もしませんが、そのプロパティを変更することはできません。 –

+0

説明をありがとう!変数ラベルや名前は、それらが指している値とは別のものだと考える良い方法が見つかりました。変数名は、関数内では常に独立しています。関数内で変数を再割り当てする場合は、そのローカル変数を再割り当てするだけです。 – cmather

+0

それは素晴らしい説明です。ちょうど私がポインタの考えをうなずけるようにします.... –

1

は残念ながら、これは直接的には不可能です。

Javascriptが(IVEは、言及見方法少なくとも厥)はパスごと値言語であり、オブジェクト型の場合には、参照によって値によってそのパス

Is JavaScript a pass-by-reference or pass-by-value language?

行きますかなり深く、特にhttps://stackoverflow.com/a/3638034/1093982はすばらしい答えがあります。パラメータに割り当てる何かが上記範囲内に運ばないでどのように

http://jsfiddle.net/hjPHJ/

注:

は、ここでは上記の解答例を実証jsfiddleです。

0

"object"を返すJavaScriptのtypeof()関数を試して、コード内で別の方法で扱うことができます。オブジェクトの値を変更する場合は、実際にプロパティの値を変更したいと思いますが、十分にあなたの質問を理解しているかどうかはわかりません。

オブジェクトプロパティを変更するには、次のようにします。

hair.color = 'red'; 

オブジェクトを設定解除したい場合は、これを行うことができます。

delete window.some_var; 
+0

私はオブジェクトに焦点を合わせていました。 Mathecが指摘しているように、このようにプリミティブ変数を変更することはできませんが、単一のオブジェクトとして渡すことができます。 –

0

Javascriptは各引数を値で参照渡しします。渡された参照の値を変更すると、コピーされた値が変更されます。

しかし、それは非常に強力で、それは閉鎖である何かを持っています。あなたの例では、onFireはすでにpantshouse、およびhairにクロージングスコープでアクセスでき、それらを直接変更することができます。

0

javascriptで関数を呼び出すと、元のオブジェクトへの参照ではなく値が渡されます。いくつかの方法がありますが、それぞれの値を渡して関数に直接渡すことではできません。

まず、あなたは配列を渡すことができます別のは、その特性が変更することができるオブジェクトを渡すことであろう

function onFire(arr) { 
    for (var i = 0; i < arr.length; i++) { 
     arr[i] = false; 
    } 
} 

arr = [true, true, {}]; 
onFire(arr); // arr[0] through arr[2] are now false 

、あなたはちょうどあなたが引数として渡す変数の値を変更することはできません:

function onFire(obj) { 
    obj.pants = false; 
    obj.house = false; 
    obj.hair = false; 
} 

onFire({ pants: true, house: true, hair: { } }); 
// obj.pants, obj.house and obj.hair are now false 

これらはいずれも、何をしたいだけで実現が、私はあなたが求めているものを行うための理由を知っていれば...より良い方法があるかもしれない

関連する問題