Falsy値の意味論




最近この記事を読みました
技術的な違いについてnull and undefined JavaScriptで.読書の後、私は、虚偽の価値の意味論がどのように簡単に解雇されて、見落とされるかについて理解しました.これらの2つの構文がしばしば混乱しているか、または最悪の場合に交換されるという事実は、falsy値の背後にある微妙で微妙な意味論についてもっと知らされる必要があることを意味します.
この記事では、私はそれを議論します.ご遠慮願います
虚偽値の技術的違いを意味論的文脈に伴うことによる記事.最後に、私たちはすべてJavaScriptで多くの偽の値の適切な使用法についての情報を知ることができます.
もちろん、これは私が厳密に議論するすべてがJavaScript言語だけに適用されることを意味しません.他の言語には、同じ意味論でないならば、類似した虚偽の構文があります.
それ以上のADOがなければ、最も簡単で最も簡単なfalsy値から始めましょう.false .


ブールfalse はブール値が満たされない場合に通信するために使われる.その使用はチェックのために最も適切です、そして、条件がどちらかであることができるだけですtrue or false —何も、何も少ない.

ゼロ( 0 )


整数0 数値演算や稀な低レベルの場合にのみ使用する必要があります.数0 は常に数値構造です.したがって、ブール型の構造体としてそれを使用することは、意味的に正しくないです.
// This is good.
function square(num) { return num * num; }

// This is semantically incorrect because the function
// is a boolean condition that checks if a number is odd.
// By interpreting the numerical result of the modulus
// operator as a boolean value, this violates the
// semantics of the `isOddNumber` function.
function isOddNumber(num) { return num % 2; }

// This can be improved by explicitly converting
// the return value to a boolean.
function isOddNumber(num) { return Boolean(num % 2); }

// This also works like the previous example,
// but it looks pretty "hacky" to be completely
// honest. The "double negative operator" uses implicit
// type coercion under the hood, which is not exactly
// desirable if we want our code to be readable,
// maintainable, and semantically correct.
function isOddNumber(num) { return !!(num % 2); }

数でない


同じ論理がNaN . 値NaN は失敗した数値演算を示すために厳密に使用される.数値演算が有効かどうかを調べるためにboolean値として使用できます.ただし、booleanプリミティブの無謀な代用として使用することはできませんtrue and false .
// This is good. There is no need to explicitly
// convert `NaN` to `false` because the function
// is a numerical operation that works fine except
// for a few edge cases (when y = 0). Semantics is
// still preserved by the returned number or `NaN`.
function divide(x, y) { return x / y; }

// This is semantically incorrect because `NaN` is
// recklessly used where `false` is already sufficient.
function canVoteInElections(person) {
  return (person.age > 18 && person.isCitizen)
    ? true : NaN;
}

空文字列([])と空の文字列('')


空っぽの配列は事実上falsy値ではありませんがas ruled by the language specification , 私は、それが意味があるならば、彼らがまだ意味的に虚偽であると思います.さらに、文字列が技術的にちょうど個々のキャラクタの配列であるので、それは空のストリングも虚偽の値であることになります.奇妙なことに、空の文字列は実際には虚偽の値である(言語仕様の上記のセクションによる).
それにもかかわらず、空の配列と空の文字列は暗黙のうちにboolean値と解釈されることはありません.配列と文字列操作のコンテキストでのみ返さなければなりません.
例えば、操作がちょうどその要素の全てを除去するために起こるならば、空の配列は返されることができます.The Array#filter function 指定した配列のすべての要素があるフィルター条件を満たす場合、空の配列を返します.すべての要素を除去するために起こったフィルタを適用した後に、単に他のいくつかのfalsy値の代わりに空の配列を返すことは、より意味をなしますfalse or NaN 結果の空の配列が前の配列からフィルタリングされたことを意味します.
完全なおもちゃ箱は関連する類推として役立つことができます.おもちゃボックスは配列を表します.おもちゃ箱からすべてのおもちゃを取り除く行為は、濾過プロセスを表します.フィルタリング処理の後、それは空っぽのおもちゃ箱で残されるのを意味します.
しかし、もしそれが空であるかどうかに基づいて、ブール型として配列を解釈することを本当に主張するなら、 Array#length property . しかし、整数値を返すので、意味的に正しいalbeitむしろペナルティ実装は、booleanプリミティブへの明示的な変換を必要とします.
// This is semantically correct.
function isEmptyArray(arr) { return !Boolean(arr.length); }

// This is also correct, but without the indication
// of an explicit conversion, this has lesser semantic
// meaning than its unabbreviated variation above.
function isEmptyArray(arr) { return !arr.length; }

// This is okay...
function logEmptyString(str) {
  if (!str)
    console.log(str);
}

// ... but this is better.
function logEmptyString(str) {
  if (str === '')
    console.log(str);
}

空のオブジェクト({})とNULL


空の配列と同じように、空のオブジェクトは言語仕様によって“truthy”と見なされます.この記事のために、私はそれらを意味的に偽りと考えます.
空のオブジェクトは、空の配列と同じ推論に従います.それらはいくつかのオブジェクト操作の結果として返されることができます.これらはbooleanプリミティブの無謀な代用として使用できません.
幸運にも、文字通り何も意味しないという虚偽の論理構造が存在します.null . オブジェクト操作が空のオブジェクトになった場合、null .
例えば、オブジェクトのコレクションを検索する関数はnull を返します.セマンティクスに関しては、文字通り空のオブジェクトよりも文字通り返すことは意味がある.その上、すべてのオブジェクトが真実である間null 単独では、そのような検索関数は明示的なブール変換を回避することができます.意味的に正しいオブジェクト検索機能の例は以下の通りです document.getElementById .
簡潔に置く、意味論null それは全く何も意図的で明示的な表現であるという事実を中心に展開します.空のオブジェクトよりも“空の”オブジェクトと考えることができます.この光の中で、突然、より多くの意味をtypeof null リターン'object' 始めからのミスだったのに.

未定義


その名の通り、undefined は厳密にはプログラムで定義されていないもののプレースホルダであるnull は存在しない何かのプレースホルダです.
故意に帰るならばundefined オブジェクト検索機能から、それはnull 絶対に何も戻らないという表現を伝える.帰ることによってundefined , 問題の検索関数は、存在しない何かでなく定義されていない何かを返します.
もっと具体的に言えば、それを仮定しましょう document.getElementById リターンundefined 指定したidを持つHTML要素が現在のところに存在しない場合 document . それはむしろ奇妙に聞こえるだろうか?
それが理由なのですnull より正しいと望ましいundefined を返します.つは基本的に無意味の同じ考えを意味しますが、言語の微妙さは完全に彼らの意味論を変えます.

結論


セマンティクスはプログラミングにおいて特に重要な課題であり、プログラムの振る舞いに大きな影響を与えないが、コードの読みやすさと保守性に大きな役割を果たしている.
示すようにnull and undefined , 同じ考えを表現しているにもかかわらず、2つの構文は意味的に異なることができます.この理由から、これらのニュアンスを認識しなければなりません.
親指の一般的な規則として、Falsyタイプは正しい文脈で使われて、返されなければなりません.データ型のセマンティクスを尊重しないため、暗黙型型強制に依存することは推奨されません.型を変換するとき、特に自然によってブーリアンであるものは、常にそれらを明示的に変換するのが意味的により良いです.