2012-02-09 13 views
7

これも可能かどうかと思います。基本的には、私は関数に渡すオブジェクトをいくつか持っており、ある条件の下ではそのオブジェクトをnullに設定したいと考えています。JavaScript - どのように/関数からヌルへのオブジェクト参照を設定できますか?

Ex。

var o = {'val' : 0}; 

f = function(v) 
{ 
    v = null; 
}; 

f(o); // Would like this to set 'o' to null 

残念ながら、私は関数の引数をnullに設定することしかできないようです。関数 'o'を呼び出した後も、依然としてオブジェクトを参照します。

これも可能ですか?そしてもしそうなら、どうですか?

答えて

7

を、次の2つのオプションがあります0の内部

var o = {'val' : 0}; 
o = f(o); 
// o == null 

を:あなたは、Oのための新しい値を返すと、このようなoをにそれを割り当てることができますf(o)

1)の場合、oの新しい値が返されます。

function f(v) { 
    if (whatever) { 
     return(null); 
    } 
} 

2)あなたが別のオブジェクトにOを入れてf()にそのコンテナオブジェクトへの参照を渡します。

function f(v) { 
    if (whatever) { 
     v.o = null; 
    } 
} 

var c = {}; 
c.o = {'val' : 0}; 

f(c); 
// c.o == null; 

JavaScriptの言語を使用して、変数へのポインタを渡すと、関数内からその変数の値を変更するために戻ってそのポインタを通じて到達させ、C/C++のように真のポインタを持っていません。代わりに、これらの他の2つの方法のうちの1つを実行する必要があります。オブジェクトと配列は参照によって渡されるので、関数から元のオブジェクトに戻ることができます。

2

本のまさに本当の使用わからないが、あなたは少し再編場合、あなたはこれを行うことができます:あなたはf(o)が呼び出されoの値を変更したい場合は

var o = {'val' : 0}; 

var f = function(v) 
{ 
    if(something){ 
     return null; 
    }else{ 
     return v; 
    } 
}; 

o = f(o); 
2

JavaScriptは常に関数の引数 "値"を渡します。これは、関数の外側の変数が指すものを関数が変更できないことを意味します。

ただし、オブジェクトを関数に渡すときに渡される「値」は、実際のオブジェクトへの参照であり、オブジェクトのコピーではありません。したがって、外部変数をnullまたは別のオブジェクトに設定することはできませんが、そのオブジェクトの内容を変更することはできます。あなたはこのような何かを行うことができます意味:あなたが関数に渡すことができますちょうどので

var containerObj = {'o' : {'val' : 0} }; 

f = function(v) { 
    v.o = null; 
}; 

f(containerObj.o); // This property would be set to null successfully. 

は明らかに非常にきれいではないコンテナオブジェクトの束を作成し、それはそれを行うための一つの方法です。

しかし、私はJames Montagneの提案で、関数にオブジェクトまたはnullを返し、その結果を変数に代入することをお勧めします。

1

私は同じ問題でここに来ました。ラッパーの回答は機能しますが、醜いですし、関数が非同期なので、null値を返すことはできません。

私はnullするoを望んでいた理由は、後に、私はOPと他の人がnullとしてそれを設定したい理由かもしれませんif (o) //do somethingを使用することです。そのため、正確な質問へのない答えが、私の解決策は、それを行うための最も簡単な方法は、NULLと呼ばれるグローバル変数を作成することと

var NULL = null 

をnullに設定します

var o = {'val' : 0}; 
f = function(v) { 
    v.isNull = true; 
} 
if (!o.isNull) // do something 
0

ました次に、元のオブジェクトを変更せずに、既存の変数をNULLに設定できます。

var NULL = null; 
var original = {}; 
var ptr = original; 
ptr = NULL; 
console.log("original is not null = " + (original!==null)); 
console.log("ptr is null = " + (ptr===null)); 
関連する問題