JavaScriptのすべての誤った値


215

何falsey 'は、JavaScriptで値があり、彼らはのような式で偽として評価することを意味し、if(value)value ?!value


Stack Overflowで誤った値の目的についてはすでにいくつかの議論がありますが、すべての誤った値が何であるかを列挙した完全な完全な回答はありません。

MDN JavaScriptリファレンス完全なリストを見つけることができませんでしたが、JavaScriptで偽の値の完全で信頼できるリストを探したときの上位の結果がブログ記事であり、その一部が明らかに省略されていることに驚きました(たとえば、NaN)、そして奇妙な、驚き、省略、間違い、または警告を指摘するためにコメントまたは代替の回答を追加できるスタックオーバーフローのような形式はありませんでした。だから、それを作るのは理にかなっているようです。




5
dorey.github.io/JavaScript-Equality-Tableは優れたリソースであり、if()真実性のタブがあります。
cloudfeet、2015年

4
うわー、本当に便利、ありがとう![[]] == ""しかし、[] != []私の頭が痛い...
user56reinstatemonica8

ECMA 262の仕様は、これらの比較規則、11.9.6による特別秒11.9.1を詳細:ecma-international.org/ecma-262/5.1/#sec-11.9.3は、 あなたがこの参照を含めるようにあなたの答えを更新した場合にはうねりだろうこれは、真偽判定が行われる(想定される)方法のルールを提供するためです。
Shaun Wilson

回答:


367

JavaScriptの誤った値

  • false
  • ゼロNumber:種類0とも-00.0と六角フォーム0x0感謝のRBT
  • BigIntタイプのゼロ:0nおよび-0n(2020の新機能、ありがとうGetMeARemoteJob
  • ""''および``-長さが0の文字列
  • null
  • undefined
  • NaN
  • document.all (HTMLブラウザーのみ)
    • これは変なものです。document.allで、falseyオブジェクトであるtypeofとしてundefined。これは、IE11の前にIEでのMicrosoft-専有関数であった、とに追加された「JavaScriptの仕様の故意の侵害」としてHTMLの仕様、IEのために書かれたサイトは、例えば、アクセスしようとしてでブレークしませんようにdocument.all.something。かつてはif (document.all)、条件付きコメントの前にIEを検出するための一般的な方法であったため、これは誤りです。参照してくださいなぜdocument.allのfalsyのですか?詳細については

「Falsey」は、JavaScriptの内部ToBoolean関数がを返すことを意味しますfalse ToBoolean根底にある!valuevalue ? ... : ...;if (value)。これが公式仕様(2020ワーキングドラフト)です1997年の最初のECMAscript仕様以降の唯一の変更は、ES6のシンボルの追加です。これは常に真実でありBigInt、上記のとおりです)。

未定義:falseを返します。 Null:falseを返します。 ブール値:引数を返します。 数値:引数が+ 0、-0、またはNaNの場合、falseを返します。 それ以外の場合はtrueを返します。 文字列:引数が空の文字列(長さがゼロ)の場合、falseを返します。 それ以外の場合はtrueを返します。 BigInt:引数が0nの場合、falseを返します。 それ以外の場合はtrueを返します。 シンボル:trueを返します。 オブジェクト:trueを返します。


==(ゆるい平等)との比較

根本的な違いにより、を使用して混乱を招く可能性のある、との偽の値の緩やかな比較==について話すことは価値ToNumber()があります。彼らは効果的に3つのグループを形成します:

  • false, 0, -0, "", '' すべてが互いに一致する ==
    • たとえばfalse == ""'' == 0したがって4/2 - 2 == 'some string'.slice(11);
  • null, undefined との一致 ==
    • 例えばnull == undefinedしかし、undefined != false
    • また、returnはオブジェクトではありませんが、これは互換性を維持するために修正されなかった長年のバグ/癖であることにも言及する価値がありtypeof nullます。それは真のオブジェクトではなく、オブジェクトは真実です(JavascriptがHTMLで実装されている場合のその「意図しない違反」を除いて)'object'nulldocument.all
  • NaN で、何も一致していない==か、===いなくても、それ自体、
    • 例えばNaN != NaNNaN !== NaNNaN != falseNaN != null

「厳密な平等」(===)の場合、そのようなグループはありません。のみfalse === false

これが、多くの開発者や多くのスタイルガイド(たとえば、standardjs)が好ん===で使用することがほとんどない理由の1つです==


実際の真実の価値観 == false

「真実」とは、JavaScriptの内部ToBoolean関数がを返すことを意味しますtrueJavascriptをの癖はを意識するように(と別の良い理由が好む===以上==):それは可能である値は(truthyするためにToBoolean戻ってtrueも)、しかし== false

あなたif (value && value == false) alert('Huh?')は、起こり得ない論理的な不可能性であると考えるかもしれませんが、それは、

  • "0"そして'0'-それらは空ではない文字列であり、真実ですが、Javascriptは==数値を同等の文字列と一致させます(例:)42 == "42"。以来0 == false、場合 "0" == 0"0" == false
  • new Number(0)そしてnew Boolean(false)-それらは真実であるオブジェクトですが==、その値を見て、それは== falseです。
  • 0 .toExponential(); -に相当する数値を持つオブジェクト 0
  • 真実である型にラップされた、偽の等しい値を与える同様の構造
  • [][[]]および[0](おかげでcloudfeetのためのJavaScript平等表リンク

さらに真実な値

これらはほんの一部の値であり、一部の人々は誤っていると予想するかもしれませんが、実際には真実です。

  • -1 およびすべてのゼロ以外の負の数
  • ' '" ""false"'null'... すべてちょうど空白ある文字列を含む非空の文字列、
  • からのすべてtypeof。常に空でない文字列を返します。次に例を示します。

  • 任意のオブジェクト(document.allブラウザーでの「悪意のある違反」を除きます。それ以外のことを示唆したとしてnullも、それは実際にはオブジェクトではないtypeofことに注意してください)。含む:

    • {}
    • []
    • function(){}または() => {}(空の関数を含む任意の関数)
    • Error およびの任意のインスタンス Error
    • 正規表現
    • newnew Number(0)およびを含むnew Boolean(false))で作成されたもの
  • 任意の記号

true1"1"および[1]リターンtrueと相互に比較==


3
FYI、何を!if?..:共通しているのは、彼らが内部呼び出すことでToBoolean値の機能を。これらの値は、文脈の中でどのように動作するか!ifなど既にその名前によって暗示されています。彼らは「falsy」値です。私は他の人が答えを読み、考えるということビット怖い「(この文脈でそうああ!if?...:)、値がされfalseますが、で!!、それはだtrueが、根本的な概念を理解していません。他の2つの点:1)v ? true : falseはの冗長な方法です!!v。2)typeof 常に空でない文字列を返します。これは真実です。
Felix Kling 2013年

1
typeof nullつまり、typeof undefined具体的に見ても意味がありません。空でない文字列は真実であると言えます。
Felix Kling 2013年

1
わかりましたが、これは元の質問とは関係ありません;)多少関連しすぎているが関連性のない情報を追加しすぎると、読者を混乱させる可能性があります。
Felix Kling 2013年

5
私はちょうどそれdocument.all同様に偽物であることを学びました。
Claudiu 2016

3
緩やかな比較について:ブール値は数値に変換されるため、x == falseToNumber(x)は非常に異なるを呼び出しますToBoolean(x)。説明する価値があるかもしれません。また、私はすでにこの回答についてすでにコメントしたことに気づきました:D
Felix Kling

3

"false"評価される空でない文字列を忘れないでくださいtrue


8
…したがって、求められた偽の値ではありませんか?
Bergi、2017年

5
タッチ。それはあなたが偽りであると期待するかもしれない値であり、それはまだ気づく価値があり、そして私は、包括的なリストで言及する価値があると思います
MrMcPlad

4
リストに追加されました...しかし、これを可能なすべての真実値の包括的なリストに変えようとはしないでください!それには時間がかかります:-)
user56reinstatemonica8

3

@ user568458の偽の値のリストに追加するだけです。

  • 整数0に加えて、10進数0.0、0.00、またはそのようなゼロっぽい数も偽の値です。

    var myNum = 0.0;
    if(myNum){
        console.log('I am a truthy value');
    }
    else {
        console.log('I am a falsy value');
    }

    上記のコードスニペットプリント I am a falsy value

  • 同様に、以下のコードスニペットに示すように、数値0の16進表記も偽の値です。

    var myNum = 0x0; //hex representation of 0
    if(myNum){
        console.log('I am a truthy value');
    }   
    else {
        console.log('I am a falsy value');
    }

    上記のコードスニペットが再び印刷されI am a falsy valueます。


7
JavaScriptには整数はありません。00x00.0および0.00同じIEEE-754の64ビット浮動小数点値ゼロのためにわずかに異なるリテラルです。
fredoverflow 2017年

1

トピックへの追加、ES2020の時点で、偽の新しい値、BigIntゼロ(0n)があります。

0n == false // true
-0n == false // true

したがって、これで、合計7つの「偽の」値があります(これは、JSではなくDOMの一部であるため、上記のユーザーが言及したdocument.allを含みません)。


1
いいね!おかげで、まだそのことは聞いていませんでした。それをビッグリストに追加し、それを上げるためのあなたの回答をクレジット表示するリンクを追加しました
user56reinstatemonica8
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.