2012-11-05 12 views
54

Express.js uygulamasında küçük bir modülü test etmek için Mocha kullanıyorum. Bu modülde, işlevlerimden biri bir dizi döndürür. Verilen bir girdi için dizinin doğru olup olmadığını test etmek istiyorum. Böyle yüzden yapıyorum: Ben bir assert.deepEqual benim testini değiştirdiğinizdeMocha ile Javascript testinde assert.equal ve assert.deepEqual arasındaki fark nedir?

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

Ancak test ince geçer: Bu çalıştığında

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

, aşağıdaki onaylama işlemi hatası alıyorum. o == vakası === vs oldu acaba ama node.js komut satırına

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

girerseniz, hala yanlış olsun.

Diziler neden diğer değerlerin karşılaştırmasını yapmıyorlar (ör. 1 == 1)? ve assert.equal ve assert.deepEqual arasındaki fark nedir?

cevap

109

Why do arrays not compare the way other values do (e.g. 1==1)

Sayılar, dizeleri, boolean

, null ve undefined değerlerdir ve Tahmin edebileceğiniz gibi karşılaştırılır. 1 == 1, 'a' == 'a', vb. Değerler durumunda === ve == arasındaki fark, =='un önce tür dönüşümü gerçekleştirmeye çalışmasıdır, bu nedenle '1' == 1 ancak '1' === 1 değil.

Diziler diğer nesnelerdir. === ve == bu durumda, işlenenlerin semantik olarak eşit olduğunu, ancak aynı nesneyi ifade ettiklerini belirtmeyin. Yukarıda açıklandığı gibi davranır. Argümanlar != ise, in the source görebildiğiniz için başarısız olur. Böylece, sayı dizileri dizileriniz için başarısız olur, çünkü esasen eşdeğer olmalarına rağmen, aynı nesne değildirler. Öte yandan, derin (yapısal) eşitlik, işlenenlerin aynı nesne olup olmadığını değil, eşdeğer olduklarını test etmemektedir. Bir anlamda, nesnelerin değermiş gibi karşılaştırılmaya zorlandığını söyleyebilirdiniz.

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! 
+2

'deepEqual()' ın harika açıklaması; Gerçekten karşınıza gelene kadar karşılaştırmada düşündüğünüz bir şey değil. – brandonscript

İlgili konular