MochaでのJavascriptテストにおけるassert.equalとassert.deepEqualの違いは?


91

Mochaを使用して、Express.jsアプリケーションの小さなモジュールをテストしています。このモジュールでは、関数の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の違いは何ですか?

回答:


158

なぜ配列は他の値のように比較しないのですか(例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!

4
の素晴らしい説明deepEqual(); あなたが実際にそれに遭遇するまで、あなたは比較で実際に何を考えているのではありません。
brandonscript
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.