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


134

JavaScriptでは、

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

var bに設定されfalseます。

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


よろしいですか、私はfalseここに到着し
anubhava

さらに一歩進んだ。スペースを含む文字列はtrueです。if( ''){console.log( '!')}ただし、 '' == 0はtrueです。
Azat 2015

2
私は@JonH版が間違っていると思い、空の文字列が''あればその真偽値コンテキストではfalseに評価されa = '';、その後a ? false : true=> '' ? false : true=> false ? false : true=> true(偽の値に対する評価であるため)。var b = (a) ? true : false;次のステートメントで正しいことになると思います。
PhoneixS

@PhoneixSが編集されました。もっと意味のあるものになってほしいと思います。
SwissCoder

1
@SwissCoderそれは読めないわけではありませんでしたが、それは別の答えを出力しました。今、私はそれを修正しました。
PhoneixS

回答:


191

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

ToBoolean

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

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


Aaaaand it is setted
Anthony

28
注意点の1つは、それnew String("")が真実であることです。これは、オブジェクトがオブジェクトであるのに対し、短い形式""はプリミティブな値のバージョンを表すためです。同じことがのために行くnew Number(0)new Boolean(false)。これは、コードでオブジェクトバージョンを使用しないことの正当な理由です。if (str.length)これif (str)は、がこのエッジケースを処理するのではなく、処理することを意味します。
Chris Middleton、

54

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

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


2
nullでないfalse、どちらでもないtruenullですnulljsfiddle.net/sq1Lkpg0
ブルーノフィンガー

7
@Bruno、NaNおよびで同じテストを実行できますundefined。彼らはそうではありませんfalseが、彼らは偽物です。それが尋ねられたものです。
ジョセフ

11

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


1
最初、私は「pssh、それはやり過ぎです。これはすでによく答えられています」と思った。しかし、それはよく提示され、有益でした。ありがとう。
Marc L.

8

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

偽の値については、http: //www.sitepoint.com/javascript-truthy-falsy/ を参照してください


君の答えは間違っている。コードを見る場合とは逆なので、var b実際にはに設定されます。truevar a
bombek

@bombekありがとう-更新します。元の質問が私の回答の後に編集されたようです(値が入れ替えられました)
Jonathon Bolster

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.