120

インタプリタ/コンソールを起動して、比較を試してください

> ",,," == Array(4)
True

なんで?最初は、「、、、」を「\ 0」の終了スライスを持つ4文字の配列と考えることができるので、おそらくそれが理由かもしれませんが、

> "..." == Array(4)

「False」を返します。なぜ?私はそれがJavascriptでのダックタイピングの特異なビットであることを知っていますが、この振る舞いを強調するものが何であるかを知りたいだけです。ところで、ゼッド・ショーの素晴らしいプレゼンテーションからこれを喜ばせました。

4

6 に答える 6

177

右側のオペランドが文字列に変換され、の文字列表現はArray(4),,,のようになるためです。

> Array(4).toString()
  ",,,"

配列コンストラクター関数を使用して数値を渡すと、配列の長さがその数値に設定されます。[,,,]したがって、4つの空のインデックス(と同じ)があり、配列のデフォルトの文字列表現は、その要素のコンマ区切りのリストであると言えます。

> ['a','b','c'].toString()
  "a,b,c"

比較がどのように機能するかは、仕様のセクション11.9.3に記載されています。そこに(x == y)が表示されます:

8. Type(x)がStringまたはNumberのいずれかであり、Type(y)がObject
の場合、比較の結果x == ToPrimitivey)を返します。

(配列はJavaScriptのオブジェクトです)

そして、あなたがその方法に従うならば、あなたはToPrimitiveそれがそれを呼ぶことに最終的に気付くでしょうtoString

于 2012-06-05T21:40:15.450 に答える
31

を使用してみてください===。Javascriptで使用==すると、変数をキャストしようとするため、このような問題が発生します。Array(4)コンソールは、文字列表現(つまりArray(4).toString、)にキャストしています",,,"。カンマが存在する理由は、.toString()関数がコンマを配列内の個別の項目に追加するためです。

以下のスニペットを参照してください。

document.write( Array(4).toString() );

于 2012-06-05T21:40:18.840 に答える
31

内部的には

",,," == Array(4).toString()
于 2012-06-05T21:40:57.107 に答える
18

これはArray(4)、4つの空の値の配列を初期化し、==暗黙的に変換するためです。

 ",,," == Array(4)

 ",,," == Array(4).toString()

 ",,," == ["", "", "", ""] // note 3 commas for 4 values

 ",,," == ["", "", "", ""].toString()

すべて似ています。

==値を比較する前に暗黙的な型変換を行います。これにより、予期しない結果が生じる可能性があります。===タイプと値を確認するために使用します。

于 2012-06-05T22:31:22.910 に答える
5

配列を文字列と比較すると、比較を行う前に配列が文字列に強制されます。空の4要素配列を文字列に強制変換すると、その正確な文字列が生成されます。

于 2012-06-05T21:41:00.507 に答える
4

最初は「試作品」だと思っていたのですが…ちょっと調べてみたら悲しい結論になりました…

どうやらそれは多くのロジックを持たない内部的でよりあいまいなjsのものです...

ちょうど試して

Array(4)==Array(4)

タイプに対する強制もありません...

Array(4)===Array(4)

FALSEになります

あなたはそれを知っていますnull==nullnull===nullそしてそれでもTRUEundefined==undefinedundefined===undefined返します...だから...それは少しあいまいです...

Array(4)==[,,,]また真実である必要があります

于 2012-06-07T21:56:22.250 に答える