javaScriptで、
var a = '';
var b = (a) ? false : true; // fixed!
var b
はfalse
に設定されます。
これは信頼できる定義済みの動作ですか?
はい。 JavascriptはECMAScriptの方言であり、ECMAScript言語仕様はこの動作を明確に定義しています。
ToBoolean
引数が空の文字列(長さがゼロ)の場合、結果はfalseです。それ以外の場合、結果は真です
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf から引用
はい。すべてのfalse
、0
、空の文字列''
および""
、NaN
、undefined
、およびnull
は常にfalse
として評価されます。それ以外はすべてtrue
です。
そして、あなたの例では、bは評価後のfalse
です。 (間違ってtrue
を書いたと思う)
var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
var
b
はtrue
に設定されます。これは信頼できる定義済みの動作ですか?
上記で回答したように、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は、conditionals(ToBoolean)definedのテスト、非ヌル、非ゼロ、非空、非偽値(空の文字列は...空、数値-0または+0は...ゼロ、NaNは定義された数値ではありません、しかし空のオブジェクトは明らかに空ではないようです)、または私が考えているように、conditionalsa(true)のテスト、==
はapparentを比較し、慎重に変換されたvalues(ToPrimitive、ToNumber)のオペランド、および===
は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のもの)ですが、==
比較ではfalse
(valueはゼロです)。再び'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
var b
はtrue
に設定されます。これは、他の値と同様に、空の文字列がJavaScriptで「偽」の値としてカウントされるためです。
http://www.sitepoint.com/javascript-truthy-falsy/ で偽の値をご覧ください
Falseに変換できる式の例は、null、0、空の文字列( "")、または未定義に評価される式です。 ( MDNリファレンス を参照)