11

私はunderscore.jsライブラリを熟読していましたが、これまでに出会ったことのないものを見つけました。

if (obj.length === +obj.length) { ... }

その+オペレーターはそこで何をしていますか?コンテキストとして、ファイルのその部分への直接リンクを次に示します。

4

4 に答える 4

7

単項+演算子は、JavaScriptで値を数値に変換するために使用できます。アンダースコアは、.lengthプロパティが数値であることをテストしているように見えます。そうでない場合、アンダースコアはそれ自体が数値に変換されたものと等しくなりません。

于 2011-11-30T17:50:55.463 に答える
4

MDNによると:

単項プラス演算子は、そのオペランドの前にあり、そのオペランドに評価されますが、数値に変換されていない場合は、数値に変換しようとします。たとえば、y = + xはxの値を取り、それをyに割り当てます。つまり、xが3の場合、yは値3を取得し、xは値3を保持します。ただし、xが文字列 "3"の場合、yも値3を取得します。単項否定(-)も非数値を変換できますが、単項プラスは、何かを数値に変換する最も高速で好ましい方法です。番号に対して他の操作を実行します。整数と浮動小数点数の文字列表現、および非文字列値true、false、およびnullを変換できます。10進数と16進数( "0x"で始まる)形式の整数がサポートされています。負の数がサポートされています(ただし、16進数はサポートされていません)。

于 2011-11-30T17:52:12.283 に答える
3

これは、obj.lengthが潜在的な文字列ではなく数値であることを確認する方法です。この理由は、長さが(何らかの理由で)文字列変数(たとえば「3」)の場合、===が失敗するためです。

于 2011-11-30T17:50:32.917 に答える
2

obj.lengthがそのタイプであるかどうかを確認するのは良いハックですnumber。ご覧のとおり、+演算子は文字列の強制に使用できます。例えば:

alert(+ "3" + 7); // alerts 10

これが可能なのは、+オペレーターが文字列"3"を数値に強制するため3です。したがって、結果はであり、では10ありません"37"

さらに、JavaScriptには2種類の等式演算子と不等演算子があります。

  1. 厳密な平等と不平等(たとえば3 === "3"、偽を表す)。
  2. 通常の平等と不平等(例えば3 == "3"、真を表す)。

厳密な平等と不平等は価値を強要しません。したがって、数値3は文字列と等しくありません"3"。通常の平等と不平等は値を強制します。したがって、数値3は文字列と同じ"3"です。

ここで、上記のコードはobj.length、演算子を使用して数値を強制し、+強制の前後の値が同じ(つまりobj.length、タイプnumber)であるかどうかを厳密にチェックします。これは、論理的に次のコードと同等です(より簡潔なもののみ)。

if (typeof obj.length === "number") {
    // code
}
于 2011-11-30T18:16:24.767 に答える