102

Express.jsアプリケーションで小さなモジュールをテストするためにMochaを使用しています。このモジュールでは、私の関数の1つが配列を返します。配列が特定の入力に対して正しいかどうかをテストしたいと思います。私はこのようにしています:

suite('getWords', function(){
    test("getWords should return list of numbers", function() {
        var result = ['555', '867', '5309'];
        assert.equal(result, getWords('555-867-5309'));
    });
});

これを実行すると、次のアサーションエラーが発生します。

AssertionError: ["555","867","5309"] == ["555","867","5309"]

ただし、テストをに変更するassert.deepEqualと、テストは正常に合格します。==vsの場合なのかと思っていたのですが===、入ったら

[1,2,3] === [1,2,3]

node.jsコマンドラインに、私はまだfalseを取得します。

配列が他の値と比較しないのはなぜですか(例1 == 1)?そして、assert.equalとassert.deepEqualの違いは何ですか?

4

1 に答える 1

174

配列が他の値と比較しないのはなぜですか(例:1 == 1)

数値、文字列、ブール値、、nullおよびundefinedは値であり、予想どおりに比較されます。 1 == 1、、'a' == 'a'など。=====の値の場合の違いは、==最初に型変換を実行しようとすることです。そのため、ではあり'1' == 1ませ '1' === 1

一方、配列はオブジェクトです。===この場合、==オペランドが意味的に等しいことを意味するのではなく、同じオブジェクトを参照することを意味します。

assert.equalとassert.deepEqualの違いは何ですか?

assert.equal上記のように動作します。ソースで!=わかるように、引数がである場合、実際には失敗します。したがって、数値文字列の配列は本質的に同等ですが、同じオブジェクトではないため、失敗します。

一方、深い(構造的)等式は、オペランドが同じオブジェクトであるかどうかをテストするのではなく、同等であるかどうかをテストします。ある意味では、オブジェクトを値であるかのように比較するように強制すると言えます。

var a = [1,2,3]  
var b = a              // As a and b both refer to the same object
a == b                 // this is true
a === b                // and this is also true

a = [1,2,3]            // here a and b have equivalent contents, but do not
b = [1,2,3]            // refer to the same Array object.
a == b                 // Thus this is false.

assert.deepEqual(a, b) // However this passes, as while a and b are not the 
                       // same object, they are still arrays containing 1, 2, 3

assert.deepEqual(1, 1) // Also passes when given equal values

var X = function() {}
a = new X
b = new X
a == b                 // false, not the same object
assert.deepEqual(a, b) // pass, both are unadorned X objects
b.foo = 'bar'
assert.deepEqual(a, b) // fail!
于 2012-11-05T04:32:33.983 に答える