私はunderscore.jsライブラリを熟読していましたが、これまでに出会ったことのないものを見つけました。
if (obj.length === +obj.length) { ... }
その+
オペレーターはそこで何をしていますか?コンテキストとして、ファイルのその部分への直接リンクを次に示します。
私はunderscore.jsライブラリを熟読していましたが、これまでに出会ったことのないものを見つけました。
if (obj.length === +obj.length) { ... }
その+
オペレーターはそこで何をしていますか?コンテキストとして、ファイルのその部分への直接リンクを次に示します。
単項+
演算子は、JavaScriptで値を数値に変換するために使用できます。アンダースコアは、.length
プロパティが数値であることをテストしているように見えます。そうでない場合、アンダースコアはそれ自体が数値に変換されたものと等しくなりません。
MDNによると:
単項プラス演算子は、そのオペランドの前にあり、そのオペランドに評価されますが、数値に変換されていない場合は、数値に変換しようとします。たとえば、y = + xはxの値を取り、それをyに割り当てます。つまり、xが3の場合、yは値3を取得し、xは値3を保持します。ただし、xが文字列 "3"の場合、yも値3を取得します。単項否定(-)も非数値を変換できますが、単項プラスは、何かを数値に変換する最も高速で好ましい方法です。番号に対して他の操作を実行します。整数と浮動小数点数の文字列表現、および非文字列値true、false、およびnullを変換できます。10進数と16進数( "0x"で始まる)形式の整数がサポートされています。負の数がサポートされています(ただし、16進数はサポートされていません)。
これは、obj.lengthが潜在的な文字列ではなく数値であることを確認する方法です。この理由は、長さが(何らかの理由で)文字列変数(たとえば「3」)の場合、===が失敗するためです。
obj.length
がそのタイプであるかどうかを確認するのは良いハックですnumber
。ご覧のとおり、+
演算子は文字列の強制に使用できます。例えば:
alert(+ "3" + 7); // alerts 10
これが可能なのは、+
オペレーターが文字列"3"
を数値に強制するため3
です。したがって、結果はであり、では10
ありません"37"
。
さらに、JavaScriptには2種類の等式演算子と不等演算子があります。
3 === "3"
、偽を表す)。3 == "3"
、真を表す)。厳密な平等と不平等は価値を強要しません。したがって、数値3
は文字列と等しくありません"3"
。通常の平等と不平等は値を強制します。したがって、数値3
は文字列と同じ"3"
です。
ここで、上記のコードはobj.length
、演算子を使用して数値を強制し、+
強制の前後の値が同じ(つまりobj.length
、タイプnumber
)であるかどうかを厳密にチェックします。これは、論理的に次のコードと同等です(より簡潔なもののみ)。
if (typeof obj.length === "number") {
// code
}