Ответ 1
Почему массивы не сравнивают то, как это делают другие значения (например, 1 == 1)
Числа, строки, логические значения, null
и undefined
являются значениями и сравниваются, как вы могли ожидать. 1 == 1
, 'a' == 'a'
и т.д. Разница между ===
и ==
в случае значений заключается в том, что ==
будет пытаться выполнить преобразование типов сначала, поэтому '1' == 1
, но не '1' === 1
.
Массивы, с другой стороны, являются объектами. ===
и ==
в этом случае не означают, что операнды семантически равны, но они относятся к одному и тому же объекту.
в чем разница между 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!