首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何测试包含未定义元素的数组的相等性?

如何测试包含未定义元素的数组的相等性?
EN

Stack Overflow用户
提问于 2013-11-07 19:33:17
回答 4查看 371关注 0票数 0

我在assert模块node.js中遇到了一些奇怪的行为。我不确定这是一个bug还是有意的行为。

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

代码语言:javascript
运行
复制
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,而数组元素只是对象上的属性。

但是为什么最后的断言失败了呢?

EN

Stack Overflow用户

发布于 2013-11-07 19:44:44

我要猜一猜。似乎在不包含任何内容(即未初始化的)且是undefined的数组位置与实际将实际的undefined插入数组中的特定位置之间存在区别。

您实际上可以在控制台日志的Chrome中看到这一点:

代码语言:javascript
运行
复制
> a = [undefined, undefined, 2];
  [undefined, undefined, 2]

> b = [,,2]
  [undefined × 2, 2]

> c = [];
> c[2] = 2;
> c
  [undefined × 2, 2]

这是一个非常微妙的区别;在第一个例子(,,2)中,您在位置01中创建了一个没有任何内容的数组;它是一个备用数组,其中只有location 3包含一个值。在第二个例子中,您创建了一个不是备用数组的数组。相反,您具体地将值undefined插入到12位置。这两种情况似乎都有不同的待遇,这可能就是它们不平等的原因。

我认为将第一个数组可视化为[,,2] = [uninitialized, uninitialized, 2]可能更容易一些。因此,区别在于未初始化的值与插入到数组中的具体未定义值(这意味着位置未初始化)。

更新

我看了一下在代码上 in assert.js。具体而言,请注意第221和222行:

代码语言:javascript
运行
复制
 if (ka.length != kb.length)
    return false;

kakb设置在第213-215行中:

代码语言:javascript
运行
复制
 var ka = Object.keys(a),
        kb = Object.keys(b),
        key, i;

Object.keys(a).length用于[,,2]的值为1,而Object.keys(b).length用于[undefined, undefined, 2]的值为3。这就是他们不平等的原因。

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19845009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档