在使用Mocha进行Javascript测试时,assert.equal和assert.deepEqual之间的区别是什么?

在使用Mocha进行Javascript测试时,assert.equal和assert.deepEqual之间的区别是什么?,javascript,arrays,testing,mocha.js,Javascript,Arrays,Testing,Mocha.js,我正在使用Mocha测试Express.js应用程序中的一个小模块。在这个模块中,我的一个函数返回一个数组。我想测试数组对于给定的输入是否正确。我是这样做的: suite('getWords', function(){ test("getWords should return list of numbers", function() { var result = ['555', '867', '5309']; assert.equal(result, ge

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

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
时,测试可以顺利通过。我想知道这是否是
=
==
的对比,但是如果我输入

[1,2,3] === [1,2,3]
在node.js命令行中,我仍然得到false

为什么数组不与其他值(例如
1==1
)进行比较?assert.equal和assert.deepEqual之间有什么区别

为什么数组不与其他值进行比较(例如1==1)

数字、字符串、布尔值、
null
undefined
都是值,并按照您的预期进行比较<代码>1==1,
'a'==a'
,依此类推。在值的情况下,
==
=
之间的区别在于,
==
将首先尝试执行类型转换,这就是为什么
'1'==1
而不是
'1'==1
的原因

另一方面,数组是对象<在这种情况下,code>=和
=
并不表示操作数在语义上相等,而是表示它们引用相同的对象

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!

deepEqual()
的精彩解释;不是你在比较中真正想到的东西,直到你真正遇到它。