2016-04-19 4 views
26

Boolean valueBoolean objectの間でlogical not operatorが異なる結果を返すのはなぜですか?次の例を考えてみましょう。 specから論理型ではないブール型オブジェクトは常にJavascriptでfalseを返します

!true // false 
!false // true 

!(new Boolean(true)) // false 
!(new Boolean(false)) // false 

、それが評価されている値はToBooleanを変換することを言います。 ToBooleanは、引数がObjectの場合はtrueを返し、引数がBooleanの場合はそのまま返します。

var a = (new Boolean(false)) ? "unexpected" : "expected"; 
console.log(a); // unexpected 

質問:

はさらに、ToBooleanも声明や条件演算子は、次の例を考えてみた場合のような他の場所で使用されている掘削Booleanオブジェクトは、オブジェクト、またはブールのですか? Booleanオブジェクトをブール値として評価してはいけませんか?


UPDATE

私の質問はthisで重複質問としてマークされました。その質問は私の質問に答えないので、満足のいく回答はありませんブールオブジェクトはオブジェクトかブールですか? Booleanオブジェクトをブール値として評価してはいけませんか?

ブールオブジェクトはオブジェクトが不十分であることを単に知っているだけで、ブールオブジェクトが処理されずに残っているオブジェクトを扱う、および/または設計する適切な方法は何か。

+0

期待通りに動作する '!Boolean(false)'を使用してください。 –

+0

ブール値(オブジェクト)がオブジェクトではなくブール値(プリミティブデータ型)になるのはなぜですか? Boolean(オブジェクト)はブール値(プリミティブデータ型)のオブジェクト表現です。 – IMTheNachoMan

答えて

31

{}truthy値であるとしてobject、それは性質を持っているか、いない場合は関係なく、決してfalse...

new Boolean(true)デフォルトはobjectないBoolean!{}を返しますが、常にfalseになるだろう(Boolean({})trueと評価されます)

deali

Boolean(INPUT)(それはBooleanの新しいインスタンスを作成し、objectを返しますよう)Booleanファクトリ関数でngの、newを使用して新しいインスタンスを作成しないことcomparison

のために使用することができ、指定 expressionprimitive-Boolean値を返します。ドキュメントから

Booleanオブジェクトがboolean value(のオブジェクトのラッパーである)

説明:最初のパラメータとして渡された値は、必要に応じてbooleanの値に変換されます。値が省略された場合、または0, -0, null, false, NaN, undefined, or the empty string ("")の場合、オブジェクトの初期値はfalseです。任意のオブジェクトまたは文字列 "false"を含む他のすべての値は、初期値がtrueのオブジェクトを作成します。

Booleanオブジェクトのtrueとfalseの値を持つ真と偽のプリミティブな真偽値を混同しないでください。 「条件文に渡されたとき。」

値がundefinednullないが、値がfalseのBoolean objectを含む任意のオブジェクトは、trueに評価します例えば [Reference]

、ステートメントがtrueMDN's entry on Booleanから

var x = new Boolean("false"); 
 
if (x) { 
 
    console.log('x is true'); 
 
} 
 

 
var y = new Boolean(false); 
 
if (y) { 
 
    console.log('y is true'); 
 
}
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

1

と評価された場合は次の条件:

値ではない任意のオブジェクトを未定義またはnull、ブール値オブジェクトを含むホース値がfalseの場合、条件文に渡すとtrueに評価されます。例えば

は、以下の条件がステートメントがtrueと評価された場合:

  alert(typeof true); //alerts boolean 
      alert(typeof new Boolean(true)); //alert object 
      alert(typeof !(new Boolean(true))); //alerts boolean 
      alert(!(new Boolean(true)));   //alerts false 

レーヨンとMukulどちらが正しい、あなただけの必要があります。

var x = new Boolean("false"); 
    if (x) { 
    // this code is executed 
    } 

    var y = new Boolean(false); 
    if (y) { 
    // this code is also executed 
    } 
0

ちょうどfolliwngを試してみました!Boolean(false) //を使用すると、trueがブール値として返されます。

1

あなたはnew Boolean(...)

Object-Oriented JavaScript Book, Stoyan Stefanov:

を使用するときは、二重否定を使用してブール同等に任意の値を変換することができますtruefalseパラメータに同じ結果を得ることができます。 値がどのようにブール値に変換されるかを理解することが重要です。ほとんどの値 は、そう!!{}!!new Boolean(true) "
ヌル
未定義 NaNの
" 偽

に変換され、次の例外を除いて、trueに!!new Boolean(false)リターン常にtrueを偽

を変換します

この条件(ダブルネゲートなし):

if (new Boolean(true) === true) { 

    console.log('this string will never be printed'); 
} 

戻りfalse、さまざまな種類があるので:

typeof new Boolean(true); // "object" 
typeof true; // "boolean" 

あなたが期待する結果を得るためにのみ値によってそれらを比較する必要があります。

if (new Boolean(true) == true) { 

    console.log('Yay!'); 
} 

new Boolean(true) == true; // true 
new Boolean(true) === true; // false 

もう一つの例:

if (new Boolean(true) === new Boolean(true)) { 

    console.log('this string will never be printed') 
} 

この場合は試してみますオブジェクトを比較する。 =====比較演算子の両方で同じ結果が得られます。

Object-Oriented JavaScript Book, Stoyan Stefanov:

あなたがオブジェクトを比較すると、あなたが同じオブジェクトを2つの の参照を比較する場合にのみ、真取得します。 がまったく同じメソッドとプロパティを持つ2つの異なるオブジェクトを比較すると、falseが返されます。

ブール型プリミティブの代わりにブール型オブジェクトnew Boolean(...)を使用しないでください。

6

Booleanは関数です。起動タイプによっては、truthyfalsyという異なる動作があります。単純な関数として

1.呼び出し

単純な関数としてBoolean(value)を呼び出すときの引数はfalsyfalsenullundefined''0Nan)またはtruthy(すべてのであれば、それを検証します他の値:オブジェクトインスタンス、1trueなど)。このタイプの呼び出しはboolean primitive typeを返します。
期待どおりに動作します:var b = new Boolean(value)

Boolean(null) // prints false 
Boolean(0) // prints false 

Boolean({}) // prints true 
Boolean(-1) // prints true 

2.呼び出しJavaScriptで任意の関数と同様に、コンストラクタ

として、Booleanはコンストラクタとして呼び出すことができます。この呼び出しタイプはboolean object instanceを返します。
JavaScriptはオブジェクトインスタンスをtruthyの値として扱うので、混乱を招きます。

var b = new Boolean(null); 

!!b // prints true, because b is an object instance 

if (b) { // b evaluates to true 
    //executed code 
} 

2.1なぜコンストラクタが可能であるように呼び出す

JavaScriptは、このコンストラクタの呼び出しは、現像剤をbooleanのプロパティの作成を保存するためのメカニズムを与えることを可能にします。プリミティブブール型はそれに割り当てられたプロパティを保存しません。 Booleanオブジェクトの作業にもかかわらず

にする方法

var booleanObject = new Boolean(null); 
booleanObject.foo = 'bar'; // create a property 
booleanObject.foo // prints 'bar' 

var booleanPrimitive = false; 
booleanPrimitive.foo = 'bar'; // create a property 
booleanPrimitive.foo // prints undefined 

2.2

は、new Boolean(value)は、比較を行うための機構を有しています。任意のJavaScriptオブジェクトと同様に、それはブールプリミティブ型(truthyとfalsyためfalsetrue)にvalueの変換を返すメソッドvalueOf()有する:条件付きでこの作業を行うに

var falsyBoolean = new Boolean(null); 
falsyBoolean.valueOf() // prints false, because null is falsy 

var truthyBoolean = new Boolean(1); 
truthyBoolean.valueOf() // prints true, because 1 is truthy 

を、それが必要ですブール値オブジェクトインスタンスの真理値への変換を避ける。 、これを実現する直接比較演算子==を使用するには:

var falsyBoolean = new Boolean(null); 

falsyBoolean == false ? 'falsy' : 'truthy' // prints expected 'falsy' 

if (falsyBoolean == false) { 
    //executed code 
} 

==演算子のオペランドは、オブジェクトや他のプリミティブ型である場合は、JavaScriptが実際にvalueOf()メソッドを呼び出すことで構成され、プリミティブ型、に変換しbooleanオブジェクトthis articleで詳細を参照してください。

3.どのように混乱しないように

最高のルールは、すべてのオブジェクトのインスタンスとしてBooleanを使用しないことです。 Boolean(value)または!!valueは、変数真理状態を検証するのに十分です。

関連する問題