用MochatestingJavascript中assert.equal和assert.deepEqual的区别?

我正在使用Mocha在我的Express.js应用程序中testing一个小模块。 在这个模块中,我的一个函数返回一个数组。 我想testing一个给定的input数组是否正确。 我这样做是这样的:

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"] 

但是,当我将testing更改为assert.deepEqual ,testing通过正常。 我想知道如果这是== vs === ,但如果我input

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

进入node.js命令行,我仍然得到错误。

为什么数组不能比较其他值的方式(例如1 == 1 )? assert.equal和assert.deepEqual有什么区别?

为什么数组不能比较其他值的方式(例如1 == 1)

数字,string,布尔值, nullundefined都是值,并按照您的预期进行比较。 1 == 1'a' == 'a' ,依此类推。 =====之间的区别在于==会先尝试执行types转换,这就是为什么'1' == 1不是 '1' === 1

另一方面,数组是对象。 =====在这种情况下并不意味着操作数在语义上是相等的,但它们指的是同一个对象

assert.equal和assert.deepEqual有什么区别?

assert.equal行为如上所述。 它实际上失败,如果参数是!= ,您可以在源代码中看到。 因此,它的数组string失败,因为虽然它们本质上是等价的,但它们不是同一个对象。

另一方面,深层(又称结构)的平等并不能检验操作数是否是同一个对象,而是它们是否相等。 从某种意义上说,你可以说它强迫对象进行比较,就好像它们是价值观一样。

 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!