var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
var b
はに設定されtrue
ます。
これは信頼できる定義済みの動作ですか?
上記の答えとして、はい、それは空の文字列の定義された振る舞いである条件で(if
表現、||
、&&
、? :
、...)。(標準では、内部のToBoolean操作を適用する必要があると規定されています。)
結果はほとんど同じですが、比較で空の文字列を使用すると(Truth、Equalityおよび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は自分によると、数字に変換するのは難しいしようとする値(、使用して 操作に標準のコールはToNumberとたToPrimitiveを)、そしてそれは内部的に適用されます===
。ただし、===
直接使用する場合、型は変換されないため、文字列とブール値の比較は常にになりfalse
ます。
大まかに言えば、JavaScriptの条件(ToBoolean)は、定義された、null以外、0以外、空ではない、falseでない値(空の文字列は...空、数値-0または+0は...ゼロ、NaNは定義された数ではなく、空のオブジェクトは明らかに本当に空でない)、または私は、考えるのが好きなように条件文のためのテスト(真)のことを、しばらくは==
比較見かけ、慎重に変換した値(たToPrimitive、はToNumberのを)そのオペランド、および正確な同一性を===
探します。
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?
そこでは多くの例であり、真実、平等やJavaScriptなど、この区別は実際に重要、'0'
あるtrue
条件で(非ゼロの長さ、または、それは事はあるが)、しかしfalse
で==
比較(値はゼロです)。'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
false
ここに到着し