コアポイント
false
、undefined
、null
、0
、""
、NaN
(空の文字列)、typeof
JavaScriptで一般的な表現がいくつかありますが、プログラミングの純粋主義者の中には、決して良いアイデアではないことがわかります。これらの表現が共通しているのは、自動型変換に依存していることです。これは、JavaScriptのコア機能であり、状況と視点に応じて利点であり不利なものです。
この記事では、これらの2つの表現に特別な注意を払い、どのケースで良いアイデアであり、どちらが良いアイデアではないかを検討したいと思います。
if()
最初の式は、単純な
if (foo) { }
2番目の式は、オプションの値を持つ可変割り当てです:
var x = foo || bar;
foo
両方の例のbar
とfoo
がブール値である場合、式は単純です。そうでないと、それ以外の場合はfoo
をfoo
に割り当てます。 x
bar
しかし、それらが単純なブール値でない場合はどうなりますか?x
がオブジェクト、文字列、または
とfoo
が異なるデータ型である場合はどうなりますか?これらの式がどのように計算されるかを理解するには、JavaScriptがデータ型間で自動的に変換する方法を理解する必要があります。 undefined
foo
bar
自動タイプ変換
javascriptは「ゆるく入力された」言語です。つまり、オペレーターまたはステートメントが特定のデータ型を期待するたびに、JavaScriptはデータを自動的にその型に変換します。最初の例のステートメントはブール値を期待するため、括弧内に定義されているものはすべてブール値に変換されます。同じことが
およびステートメントにも当てはまります。 if()
このような変換の結果(つまり、真または偽)によれば、JavaScript値はしばしば「真」または「偽の値」と呼ばれます。それを理解する最も簡単な方法は、値が誤った値であることが知られていない限り、実際には6 <
false
undefined
null
0
""
NaN
ネイティブコンストラクターが含まれます。 (少し混乱しますが、実際には、そのようなネイティブの価値を作成する必要はありません。)
new Boolean(false)
注:2つのfalse値を比較すると、両方が誤った値であっても、(
null != false
条件付きショートカット
DOM仕様には存在しない要素が戻るif()
を処理する必要があるため、これはDOM要素を処理するときに常に確実に機能します。 null
if (foo) { }
"を示すためによく使用されますが、障害を引き起こす可能性のあるいくつかの状況があります。したがって、たとえば、それがブール値null
または空の文字列である場合、
が既に定義されている場合でも、条件付きコードは実行されません。
var x = foo || bar;
未定義のパラメーター(およびその他の変数)のデータ型は「foo
」です。したがって、パラメーターのデータ型をテストするためにfalse
比較器を使用して、foo
が完全に定義されている場合、条件は常に通過します。もちろん、式は依然としてブール値を計算していますが、計算するブール値は式の結果です。
var element = document.getElementById("whatever"); if (element) { // 元素存在 } else { // 元素不存在 }
undefined
最初に示した2番目の例では、論理演算子を使用して、2つの値のどれを変数に割り当てる必要があるかを判断します。
typeof
foo
論理演算子はif()
ブール値を返しませんが、typeof
ブール値をまだ期待しているため、変換と計算は内部で発生します。 がtrueに評価された場合、の値は返されます。そうしないと、
この式は通常、イベントハンドラーで見られ、サポートされているモデルに基づいてイベントパラメーターを定義するために使用されます。
したがって、if (foo) { }
);それ以外の場合は、e
を返します。 undefined
同じタイプの式の式もイベント属性を割り当てるためによく使用されます。各可能性を評価することにより、サポートされている属性を見つけます。
e
したがって、これらの参照はそれぞれ(左から右へ)順番に評価され、最初の計算が返されます。最初のケースは標準モデルを処理します。2番目のケースはインターネットエクスプローラー用です。3番目のケースは、イベントがウィンドウオブジェクト(window.event
プロパティなし)でトリガーされる場合があるインターネットエクスプローラー用です。
しかし、この表現は、データの真実を知らずに、失敗する傾向があります。たとえば、別の一般的なユースケースは、オプションのパラメーターのデフォルト値を定義することですが、これは良くありません。
var x = foo || bar;
srcElement
が常に
であると確信している場合、空の文字列を
として扱う必要がある場合、式は安全です。しかし、そうでない場合は、より正確なコンテンツとして再定義する必要があります。var element = document.getElementById("whatever"); if (element) { // 元素存在 } else { // 元素不存在 }
foo
問題を引き起こす可能性のある驚くほど微妙な状況がいくつかあります。たとえば、入力タイムスタンプがオプションで定義されていない限り、UNIXタイムスタンプを作成する日付関数がある場合があります。
入力が0の場合、ゼロは誤った値であるため、失敗しますが、有効なタイムスタンプでもあります。 undefined
undefined
function doStuff(foo) { if (foo) { ... } }
foo
これらすべてから学んだ一般的なレッスンは簡単です。タイプの変換が評価にどのように影響するかを考えて、遭遇するトラップに陥らないように注意してください。適切な注意と注意を払えば、自動型変換を利用して、必要に応じて条件と論理式を短縮することができます。
function doStuff(foo) { if (typeof foo != "undefined") { ... } }
常に
常に明確ではありませんか?もちろん、より短い文法を好む理由がそれがより速くタイプするという理由だけである場合、これは怠zyでずさんな理由です。var x = foo || bar;
しかし、真実は、JavaScriptは通常、パブリックネットワーク上で実行されるということです。その場合、ファイルサイズが重要です。小さいファイルはロードが速く、帯域幅が少なくなり、小さな構文のショートカットが実際に蓄積する可能性があります。
より短い式を使用することは最適化そのものではなく、単なるプログラミングスタイルであり、言語機能を最大限に活用しています。
(元のテキストのFAQセクションは、この部分の内容が記事のトピックに弱く関連しており、より長いため、ここでは省略されているため、擬似オリジナル作品で保持するのに適していません。)
以上が現実の世界での自動タイプ変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。