72

次の用途は何ですか:

var flag = new Boolean(false); 

に比べ:

var flag = false;

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

4

4 に答える 4

75

グローバル関数は、たとえば、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

ブール値にプロパティを割り当てることができる便利なアプリケーションに出くわしたことはありませんが、プリミティブ値への参照が必要な場合はボクシングが役立つ可能性があります。

于 2009-05-13T09:35:47.837 に答える
24

他の人が理論について言及しましたが、実際の部分について話しましょう。

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

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

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

foo = { value: false };

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

于 2013-06-21T06:29:06.320 に答える