2

このテストに正しく反応する関数 sortByFoo を Javascript で書くように依頼されました。

// Does not crash on an empty array
console.log(sortByFoo([]) === []);

しかし、私は何かを試しました:

[] === [];
>> false

確かに、そのようなテストは、 sortByFoo 関数に関係なく、常に失敗しますよね?しかし、私はなぜこれが起こるのかについて説明したいと思います。[] が [] と同一/等しくないのはなぜですか?

おおよその英語を許してください、それは私の母国語ではありません:p

4

4 に答える 4

4

javascript/ecmascript の仕様、特にセクション 11.9.6を見ると、 との比較がどのように===実行されるかがわかります。

厳密な等価比較アルゴリズム

比較 x === y (x と y は値) は、true または false を生成します。このような比較は、次のように実行されます。

  1. Type(x) が Type(y) と異なる場合は、false を返します。
  2. Type(x) が未定義の場合、true を返します。
  3. Type(x) が Null の場合、true を返します。
  4. Type(x) が Number の場合、
    • x が NaN の場合、false を返します。
    • y が NaN の場合、false を返します。
    • x が y と同じ数値の場合、true を返します。
    • x が +0 で y が -0 の場合、true を返します。
    • x が −0 で y が +0 の場合、true を返します。
    • false を返します。
  5. Type(x) が String の場合、x と y がまったく同じ文字シーケンス (同じ長さと対応する位置の同じ文字) であれば true を返します。それ以外の場合は false を返します。
  6. Type(x) が Boolean の場合、x と y が両方とも true または両方とも false の場合は true を返します。それ以外の場合は false を返します。
  7. x と y が同じオブジェクトを参照している場合は true を返します。それ以外の場合は false を返します。

配列は 7 番目のステップまでずっと続くため、2 つの同一のオブジェクトだけでなく、同じオブジェクトである必要があります。同じことが通常の等価演算子 ( ==) にも当てはまります。

于 2013-12-09T15:23:51.273 に答える
3

書くたび[]に、配列のコンストラクターを呼び出しているからです。

[]は と同じですがnew Array()、Javascript では equals メソッドと比較される新しいオブジェクトは異なります。リファレンスを参照してください。new Object()を使用する場合と同じ{}です。

于 2013-12-09T15:14:29.557 に答える
1

はい、2 つの配列リテラルが決して等しくないことは正しいです。これは、配列の 2 つの別個のインスタンスへの参照であるためです。

テストを記述するコードは次のように記述します。

var arr = [];
var result = sortByFoo(arr);
console.log(result === arr && result.length == 0);

関数によって返された参照が送信されたものと同じであること、および配列がまだ空であることを確認することで、関数が変更されていない同じ配列を返すことが保証されます。

于 2013-12-09T15:22:09.870 に答える