我在node.js的assert模块中遇到了一些奇怪的行为。我不确定这是错误还是预期的行为。

当我创建一个数组,然后在第三个元素上初始化一个值时,前两个元素是未定义的。测试前两个元素是否未定义将返回true,但是将数组与前两个元素的整体与undefined进行比较失败。

var assert = require('assert');

var a = [];
a[2] = 2;
console.log(a);    // [ , , 2 ]

assert.equal(a[0], undefined);                  // ok
assert.equal(a[1], undefined);                  // ok
assert.equal(a[2], 2);                          // ok
assert.deepEqual(a, [, , 2]);                   // ok
assert.deepEqual(a, [undefined, undefined, 2]); // error ???


我可以理解,未定义元素和具有值undefined的元素之间存在区别,因为Array扩展了Object,而数组元素只是对象上的属性。

但是,为什么最后一个断言失败了?

最佳答案

最可能是因为[,,2][undefined,undefined,2]没有相同数量的键:

> Object.keys([,,2]).length
1
> Object.keys([undefined,undefined,2]).length
3


这是正在检查此代码的assert代码的relevant part

09-25 17:10
查看更多