Mocha ile Javascript testinde assert.equal ve assert.deepEqual arasındaki fark nedir?


94

Express.js uygulamamda küçük bir modülü test etmek için Mocha kullanıyorum. Bu modülde, işlevlerimden biri bir dizi döndürüyor. Dizinin belirli bir girdi için doğru olup olmadığını test etmek istiyorum. Ben böyle yapıyorum:

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

Bu çalıştığında, aşağıdaki onaylama hatasını alıyorum:

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

Ancak, testimi bir olarak değiştirdiğimde assert.deepEqual, test iyi geçiyor. Bir ==vs durumu olup olmadığını merak ediyordum ===ama girersem

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

node.js komut satırına girdim, hala yanlış alıyorum.

Diziler neden diğer değerlerin yaptığı gibi karşılaştırmaz (ör. 1 == 1)? ve assert.equal ile assert.deepEqual arasındaki fark nedir?

Yanıtlar:


161

Neden diziler diğer değerlerin yaptığı gibi karşılaştırmıyor (ör. 1 == 1)

Sayılar, dizeler, boole'lar nullve undefineddeğerlerdir ve beklediğiniz gibi karşılaştırılır. 1 == 1, 'a' == 'a'vb. Değerler söz konusu olduğunda arasındaki ===ve ==arasındaki fark ==, ilk önce tür dönüştürmeyi gerçekleştirmeye çalışacak olmasıdır, bu yüzden, '1' == 1ancak değil '1' === 1 .

Diziler ise nesnelerdir. ===ve ==bu durumda işlenenlerin anlamsal olarak eşit olduğunu değil , aynı nesneyi ifade ettiklerini belirtmez .

assert.equal ve assert.deepEqual arasındaki fark nedir?

assert.equalyukarıda açıklandığı gibi davranır. Kaynakta!= görebileceğiniz gibi , argümanlar doğruysa, aslında başarısız olur . Bu nedenle, sayı dizeleri dizileriniz için başarısız olur çünkü esasen eşdeğer olmalarına rağmen, aynı nesne değildirler.

Öte yandan, derin (diğer adıyla yapısal) eşitlik, işlenenlerin aynı nesne olup olmadığını değil, eşdeğer olduklarını test eder. Bir anlamda, nesneleri değermiş gibi karşılaştırmaya zorladığını söyleyebilirsiniz.

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
Harika bir açıklama deepEqual(); gerçekten karşılaşana kadar karşılaştırmada düşündüğünüz bir şey değil.
brandonscript
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.