13

のような配列があるコードの一部に取り組んでいます[[data]]。はdata、Djangoテンプレートエンジンを介してサーバー側でレンダリングされます。したがって、私のコードは次のようになります。

var data = {{ series|safe }}; 
// data will be [[]] if no data is present
if (data ==[[]])
  console.log('no data');

if常にを返しますfalse。つまり、in [[]] == [[]]isfalseであり、私のテストではそれも同様であること[]==[]が示されています。false

任意の説明をいただければ幸いです。

4

6 に答える 6

16

==(および===)テストして、2つのオブジェクトが同じオブジェクトであるかどうかを確認し、同一のオブジェクトであるかどうかを確認しないためです。

deepEqualほとんどのテストフレームワークには、2つのオブジェクトが同一であるかどうかを確認したい場合などの関数が含まれています。

于 2012-12-04T12:46:48.060 に答える
12

この式[] == []には、次の同等の表記があります。

new Array() == new Array()

Arrayまた、それがであることがわかっているので、比較の動作は、 ECMAScript言語仕様の「抽象等価比較アルゴリズム」セクションでObject明確に説明されています。

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

  1. Type(x)がType(y)と同じである場合、
    1. Type(x)がUndefinedの場合、trueを返します。
    2. Type(x)がNullの場合、trueを返します。
    3. Type(x)がNumberの場合、
      1. xがNaNの場合、falseを返します。
      2. yがNaNの場合、falseを返します。
      3. xがyと同じ数値である場合、trueを返します。
      4. xが+0でyが-0の場合、trueを返します。
      5. xが-0で、yが+0の場合、trueを返します。
      6. falseを返します。
    4. Type(x)がStringの場合、xとyがまったく同じ文字シーケンス(対応する位置で同じ長さと同じ文字)であればtrueを返します。それ以外の場合は、falseを返します。
    5. Type(x)がブール値の場合、xとyが両方ともtrueまたは両方がfalseの場合はtrueを返します。それ以外の場合は、falseを返します。
    6. xとyが同じオブジェクトを参照している場合は、trueを返します。それ以外の場合は、falseを返します。
  2. xがnullで、yが未定義の場合、trueを返します。
  3. xが未定義で、yがnullの場合、trueを返します。
  4. Type(x)がNumberで、Type(y)がStringの場合、比較の結果x == ToNumber(y)を返します。
  5. Type(x)がStringで、Type(y)がNumberの場合、比較の結果ToNumber(x)==yを返します。
  6. Type(x)がブール値の場合、比較ToNumber(x)==yの結果を返します。
  7. Type(y)がブール値の場合、比較の結果x == ToNumber(y)を返します。
  8. Type(x)がStringまたはNumberのいずれかであり、Type(y)がObjectの場合、比較の結果x == ToPrimitive(y)を返します。
  9. Type(x)がObjectで、Type(y)がStringまたはNumberの場合、比較ToPrimitive(x)==yの結果を返します。
  10. falseを返します。

比較結果は1.6、上で強調表示されているによって説明されます。

代替表現

あなたの場合、代わりにこの条件を使用することをお勧めします。

if (a[0].length == 0) {
    console.log('no data');
}
于 2012-12-04T12:48:38.417 に答える
6

新しい配列を作成するため[]、ある配列オブジェクトを別の配列オブジェクトと比較しています。

比較されるのは配列の内容ではなく、オブジェクト参照が比較されます。同じオブジェクトインスタンスではないため、これらは等しくありません。

于 2012-12-04T12:48:10.840 に答える
3

Javascriptは、演算子がプリミティブ型の==を比較するという点でJavaに似ていますが、オブジェクトの参照です。2つの配列を作成していて、演算子は、それらがメモリ内の同じ正確なオブジェクトを指していないことを示しています。==

var b = new Array( 1, 2, 3 );
var c = new Array( 1, 2, 3 );

console.log(b == c); // Prints false.
console.log(b == b); // Prints true.
console.log(b === c); // Prints false.

b = c;

console.log(b == c); // Now prints true.

オブジェクトの値を比較する場合は、手作業で詳細な比較を行う必要があります。

于 2012-12-04T13:06:21.250 に答える
2

配列は参照型であるため、たとえば、配列を作成する場合

a = [1,2,3,4,5];

b=aとします。

bは実際には配列aの単なる参照であるため、それらを比較すると

a === bは真です

それらは基本的に相互にリンクしているためです。したがって、何かを配列bに変更すると、配列aにも変更されます。

b [0]="テスト";

配列aは["test"、2,3,4,5];

しかし、これを行うと

a = [1,2,3,4,5];

b = a.slice(0);とします。

そしてそれらを比較します

a===bはfalseです

これは両方とも異なる配列であるためです。つまり、配列bを変更しても、配列aには影響しません。

b [0]="こんにちは";

配列aはまだ[1,2,3,4,5]です

配列bは["hello"、2,3,4,5]になりました

これは、 []===[]がfalseであると比較したときにも起こります。

基本的にJavaScriptに求めているのは、それらが同じ配列であるかどうかということです。

于 2018-06-23T07:26:18.713 に答える
1

それらは配列の異なるインスタンスであるため、等しくありません。

于 2012-12-04T12:47:46.913 に答える