Sự khác biệt giữa khẳng định.equal và khẳng định.deepEqual trong thử nghiệm Javascript với Mocha?


91

Tôi đang sử dụng Mocha để kiểm tra một mô-đun nhỏ trong ứng dụng Express.js của mình. Trong mô-đun này, một trong các hàm của tôi trả về một mảng. Tôi muốn kiểm tra xem mảng có đúng với một đầu vào nhất định hay không. Tôi đang làm như thế này:

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

Khi điều này chạy, tôi nhận được lỗi xác nhận sau:

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

Tuy nhiên, khi tôi thay đổi bài kiểm tra của mình thành một assert.deepEqual, bài kiểm tra vẫn tốt. Tôi đã tự hỏi liệu đó có phải là trường hợp của ==vs ===, nhưng nếu tôi nhập

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

vào dòng lệnh node.js, tôi vẫn nhận được sai.

Tại sao các mảng không so sánh theo cách các giá trị khác làm (ví dụ 1 == 1)? và sự khác biệt giữa khẳng định.equal và khẳng định.deepEqual là gì?

Câu trả lời:


158

Tại sao các mảng không so sánh theo cách các giá trị khác làm (ví dụ: 1 == 1)

Số, chuỗi, boolean, nullundefinedlà các giá trị, và được so sánh như bạn có thể mong đợi. 1 == 1, 'a' == 'a'và như vậy. Sự khác biệt giữa =====trong trường hợp các giá trị ==sẽ cố gắng thực hiện chuyển đổi kiểu đầu tiên, đó là lý do tại sao '1' == 1nhưng không '1' === 1 .

Mặt khác, mảng là các đối tượng. =====trong trường hợp này không biểu thị rằng các toán hạng là bình đẳng về mặt ngữ nghĩa, nhưng chúng tham chiếu đến cùng một đối tượng .

Sự khác biệt giữa khẳng định.equal và khẳng định.deepEqual là gì?

assert.equalhành xử như đã giải thích ở trên. Nó thực sự không thành công nếu các đối số !=, như bạn có thể thấy trong nguồn . Vì vậy, nó không thành công cho các mảng chuỗi số của bạn vì mặc dù chúng về cơ bản là tương đương, chúng không phải là cùng một đối tượng.

Mặt khác, bình đẳng sâu (hay còn gọi là cấu trúc) không kiểm tra xem các toán hạng có phải là cùng một đối tượng hay không, mà là chúng tương đương nhau. Theo một nghĩa nào đó, bạn có thể nói rằng nó buộc các đối tượng được so sánh như thể chúng là các giá trị.

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
Giải thích tuyệt vời về deepEqual(); không thực sự là điều bạn nghĩ đến khi so sánh cho đến khi bạn thực sự bắt gặp nó.
brandonscript
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.