web-dev-qa-db-ja.com

javascriptでは、空の文字列は常にブール値としてfalseですか?

javaScriptで、

var a = '';
var b = (a) ? false : true;   // fixed!

var bfalseに設定されます。

これは信頼できる定義済みの動作ですか?

122
cc young

はい。 JavascriptはECMAScriptの方言であり、ECMAScript言語仕様はこの動作を明確に定義しています。

ToBoolean

引数が空の文字列(長さがゼロ)の場合、結果はfalseです。それ以外の場合、結果は真です

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf から引用

171
Arenielle

はい。すべてのfalse0、空の文字列''および""NaNundefined、およびnullは常にfalseとして評価されます。それ以外はすべてtrueです。

そして、あなたの例では、bは評価後のfalseです。 (間違ってtrueを書いたと思う)

52
Hossein
var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true

var btrueに設定されます。

これは信頼できる定義済みの動作ですか?

上記で回答したように、yes、つまり空の文字列の条件付きif式、||&&? :、...)。 ( 標準では、内部ToBoolean操作を適用する必要があることを に示しています。)

比較では空の文字列が使用された場合、評価は異なります( 真理、等価、JavaScript を参照)、結果はほぼ同じ

// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length     => false

// comparisons
console.log('' == true);        // +0 === 1        => false
console.log('' == false);       // +0 === +0       => true
console.log('' === true);       // different types => false
console.log('' === false);      // different types => false

説明:基本的に、==のオペランドのタイプが異なる場合、JavaScriptは、value、( usingoperations 標準呼び出しToNumberおよびToPrimitive)、そして、内部的に===を適用します。ただし、===を直接使用すると、型は変換されないため、文字列とブール値の比較は常にfalseになります。

大まかに言えば、JavaScriptは、conditionalsToBooleandefinedのテスト、非ヌル、非ゼロ、非空、非偽値(空の文字列は...空、数値-0または+0は...ゼロ、NaNは定義された数値ではありません、しかし空のオブジェクトは明らかに空ではないようです)、または私が考えているように、conditionalsa(true)のテスト==apparentを比較し、慎重に変換されたvaluesToPrimitiveToNumber)のオペランド、および===exact samenessを探します。

if (X) {}        // is X a (true) thing?
if (X == Y) {}   // are the values of X and Y same-ish?
if (X === Y) {}  // are X and Y exactly the same?

Truth、Equality and JavaScript には、この区別が本当に重要な例が他にもあります。 '0'は条件付きではtrue(ゼロ以外の長さ、またはitのもの)ですが、==比較ではfalsevalueはゼロです)。再び'1'は、どちらの場合もtrueです(これは物であり、ゼロ以外の値を持っています)。

console.log('' ? true : false);   // zero length     => false
console.log('' == true);          // +0 === 1        => false
console.log('0' ? true : false);  // non-zero length => true
console.log('0' == true);         // +0 === 1        => false
console.log('1' ? true : false);  // non-zero length => true
console.log('1' == true);         //  1 === 1        => true
9
Orafu

var btrueに設定されます。これは、他の値と同様に、空の文字列がJavaScriptで「偽」の値としてカウントされるためです。

http://www.sitepoint.com/javascript-truthy-falsy/ で偽の値をご覧ください

8

Falseに変換できる式の例は、null、0、空の文字列( "")、または未定義に評価される式です。 ( MDNリファレンス を参照)

5