偽の値とnull、未定義、または空の文字列


11

私は長年jQueryを使用してきました。しかし、最近、私はJavaScript言語に深く関わっています。最近、私は「真実」と偽の値について聞いたことがあります。しかし、私はそれらを完全に理解していません。現在、次のようなコードがあります。

var fields = options.fields || ['id', 'query'];

フィールドがnullであるか、未定義であるか、または長さが0であるかを識別する必要があります。これを行うには長い道のりがあります。

if ((fields === null) || (fields === undefined) || (fields.length === 0)) {
 ...                    
}

私の質問は、以下は同じです:

if (!fields)  {
 ...
}

回答:


23

プログラミングでは、真実性または偽造性は、実際のブール値に解決されないが、ブール結果として解釈されるブール式の品質です。

Cの場合、ゼロに評価される式はすべてfalseと解釈されます。Javascriptを、表現の中value

if(value) {
}

valueでない場合、trueと評価されます。

null
undefined
NaN
empty string ("")
0
false

参照
JavaScriptでnull、未定義、または空白の変数をチェックする標準関数はありますか?


9

JavaScriptの「真の」値と「偽の」値のセットは、値をブール値に強制するときに使用されるToBooleanECMAScript仕様定義された抽象的な操作から取得されます。

+--------------------------------------------------------------------------+
| Argument Type | Result                                                   |
|---------------+----------------------------------------------------------|
| Undefined     | false                                                    |
|---------------+----------------------------------------------------------|
| Null          | false                                                    |
|---------------+----------------------------------------------------------|
| Boolean       | The result equals the input argument (no conversion).    |
|---------------+----------------------------------------------------------|
| Number        | The result is false if the argument is +0, 0, or NaN;   |
|               | otherwise the result is true.                            |
|---------------+----------------------------------------------------------|
| String        | The result is false if the argument is the empty String  |
|               | (its length is zero); otherwise the result is true.      |
|---------------+----------------------------------------------------------|
| Object        | true                                                     |
+--------------------------------------------------------------------------+

この表から、我々はそれを見ることができますnullし、undefined両方に強制変換されているfalseブール値のコンテキストで。ただし、fields.length === 0通常はfalse値にマッピングされません。fields.lengthが文字列の場合、false(長さがゼロの文字列はであるため)として扱われますfalseが、それがオブジェクト(配列を含む)の場合は、強制的にになりtrueます。

fields文字列でなければならない場合!fieldsは、十分な述語です。場合はfields、配列である、あなたの最高のチェックは次のようになります。

if (!fields || fields.length === 0)

2

簡潔な答え:

いいえ、同じではありません

しかしこれは:

if (!fields) { ... }

これと同じです:

if ((fields === null) || (fields === undefined) || (fields === 0) || (fields === '') || (fields === NaN) || (fields === flase)) { ...
}

長い(そしてより良い)答え:

まず、真実と偽りの価値について話しましょう。

何かをブール値として評価したときに何が起こるかがすべてです。JavaScriptでは、これはifステートメントなどを使用すると発生します。論理演算子は好き||!または&&; またはBoolean()関数。

Boolean()関数は、いずれかの値とリターンを受け入れますtrueか、false

例えば:

var age = 1; // Let's evaluate age as a boolean Boolean(age); // true

先に進んで、これをノード複製で試してください。

ブール値は、唯一可能truefalseの戻り値はので、Boolean() しなければならないのいずれかですtruefalse。この場合、値を渡し1、ブール値として評価すると1is trueです。

重要:ブール値として評価される場合、値はtrueまたはfalseでなければなりません。これらは2つのオプションのみです。

JavaScriptでは、偽の値は6つしかありません。falseブール値として評価される場合の値。:彼らはfalse0""nullundefined、とNaN。したがって、これらの値のいずれかがブール値として評価されると、それらはfalseになります。

Boolean(false) // false Boolean(0) // false Boolean("") // false Boolean(null) // false Boolean(undefined) // false Boolean(NaN) // false

つまり、JavaScriptの他の値はtrue、ブール値として評価されます。したがって、JavaScriptの他のすべての値は真実です。

として何かを評価する別の簡単な方法booleanは、!演算子を使用することです。Boolean関数と同様に、これは値をブール値として評価します。しかし、真実の値はになりfalse、偽の値はになりtrueます。

!false // true !0 // true !"" / true !null // true !undefined // true !NaN // true

繰り返しますが、ノードのreplなどで試して、理解していることを確認してください。

したがって、このステートメント:

if (!fields) { ... }

次のように言っています:「fieldsブール値として評価された場合、falseの場合、このifステートメント内でコードを実行します。」

最初のステートメントについて:

var fields = options.fields || ['id', 'query'];

論理OR演算子を使用しているので、理解するために一読する価値があります。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators


0

あなたのコードは以下を意味します:

var fields;
if (options.fields)
    fields = options.fields;
else
    fields = ['id', 'query'];

これoptions.fieldsでブール値に変換されます。定義によるとnullundefined0""に変換され、false(主に)何かがに変換され、true(私はそう正確になりたくありません)。

fields.length === 0ラインだから同じという意味ではありません。空の配列と他のオブジェクトはに変換されtrueます。

注:Javascriptは大きな混乱を招くことがあります...たとえば、2つの型チェック演算子(typeofとinstanceof)は実際には必要ありません。true instanceof Boolean機能しないときにpplを混乱させるだけでtypeof(true) == "boolean"、オートコンプリートなしで文字列を入力すると、エラーが発生しやすくなります。たぶんいくつかの新しいバージョンではこれらの問題は解決されるでしょう。


-1

(!! fields)を試すことができます。fields要素がnull、未定義、または長さが0の場合、trueを返します。または(!!!フィールド)の場合、これはtrueを返します。

ダブル !または!! trueまたはfalseを強制します。私はこれについて良い定義を見つけることができるといいのですが、それを再び見つけることができないようです。


1
「!!!」「!」と同じです 定義上、「!!!!!」そして「!!!!!!!」。値を「通知する」ことは、何かが真実であるか偽物であるかを確認するために使用できます。つまり、真実または偽の値とは正確には何ですか?
Jeffrey Sweeney

:私はより良いではないではないオペレータ記述することを記事見つけbennadel.com/blog/... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... それはブール値にあなたの条件になりますが。
Randy Collier、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.