web-dev-qa-db-ja.com

JavaScriptのnew Boolean()の目的は何ですか?

の使用は何ですか:

var flag = new Boolean(false); 

に比べ:

var flag = false;

いつ実際にnew Booleanを使用しますか?

59
zeroin23

グローバル関数Boolean()は、newなしで呼び出されたときに型キャストに使用できます。たとえば、

_var foo = Boolean(bar); // equivalent to `var foo = !!bar`
_

newを指定して呼び出すと、ラッパーオブジェクトが追加で作成されます。つまり、オブジェクトに任意のプロパティを割り当てることができます。

_var foo = new Boolean(bar); // equivalent to `var foo = Object(Boolean(bar));`
foo.baz = 'quux';
alert(foo.baz);
_

プリミティブはプロパティを保持できないため、これはプリミティブ値では不可能です。

_var foo = true;
foo.baz = 'quux';
alert(foo.baz); // `foo.baz` is `undefined`
_

プロパティをプリミティブに割り当てても、自動ボックス化のためにエラーは発生しません。

_foo.baz = 'quux';
_

として解釈されます

_// create and immediately discard a wrapper object:
(new Boolean(foo)).baz = 'quux';
_

プリミティブ値を元に戻すには、valueOf()メソッドを呼び出す必要があります。ラップされた値がtrueであっても、オブジェクトはブールコンテキストで常にfalseに評価されるため、実際にラップされた値を使用する場合、これが必要です。

ブール値にプロパティを割り当てることができるという便利なアプリケーションに出会ったことはありませんが、プリミティブ値への参照が必要な場合は、ボックス化が役立つ場合があります。

64
Christoph

他の人が理論に言及している間、私は実際的な部分について話させてください:

Booleanオブジェクト(オブジェクト一般)は常に真実であるため、これらを使用することは悪い習慣と見なされます。長年のJSプログラミングでは、私はそれらを使用したことがなく、他の人のコードでBooleansを目にしたことも覚えていません。一度もありません。

プリミティブ値を使用すると、混乱が回避され、コードが少し短くなります。

オブジェクトにラップされたブール値が必要な場合は、次のようにObjectオブジェクトを使用することもできます。

_foo = { value: false };
_

また、Boolean()コンストラクターを関数として呼び出すと(foo = Boolean(bar)のように)、_!!_を使用した明示的な型キャストと同じ効果が得られます。通常、後者は前者よりも優先されます。

21

ブールクラスは揺れ動く。このスパゲッティコードの代わりに????:

if (foo===true) this.launch();
else this.dontLaunch();

優れたプログラマーなら何でもできるので、プロトタイプを拡張できます。

Boolean.prototype.ifTrue=function(ifFunc,elseFunc){
    if (this.valueOf()===true) ifFunc(); 
    else elseFunc();
}
var foo=new Boolean(/*expression*/);
foo.ifTrue(this.launch.bind(this),this.dontLaunch.bind(this));

今はずっと良い。

3
Nick Manning

上記の質問の前に、まずブール関数Boolean ()

Boolean(10 > 4) // return true
Boolean(4 > 9) // return false

次に、実際の値を持つものはすべてtrueを返します。例えば

100
-4
4.4
"hello"
"false" // note even the string value false return true.

実際の値のないものはすべてfalseを返します。

NaN 
var x = 10 / "H"; // Boolean(x); return false.
undefined
"" 
0
-0
false 
null

現在、Booleanオブジェクトはブール値のオブジェクトラッパーです。最初のパラメーターとして渡された値は、必要に応じてブール値に変換されます。値が省略されている場合、または0, -0, null, false, NaN, undefined、または空の文字列("")、オブジェクトの初期値はfalseです。オブジェクトまたは文字列 "false"を含む他のすべての値は、trueの初期値を持つオブジェクトを作成します。

これは非常に強力なトリックを可能にします。

1
user5537573