首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对使用`new`创建的数组上的`map`行为感到困惑

对使用`new`创建的数组上的`map`行为感到困惑
EN

Stack Overflow用户
提问于 2012-07-27 23:01:38
回答 4查看 666关注 0票数 17

对使用new创建的数组执行mapping的结果让我感到困惑

代码语言:javascript
复制
function returnsFourteen() {
    return 14;
}

var a = new Array(4);
> [undefined x 4] in Chrome, [, , , ,] in Firefox
a.map(returnsFourteen);
> [undefined x 4] in Chrome, [, , , ,] in Firefox

var b = [undefined, undefined, undefined, undefined];
> [undefined, undefined, undefined, undefined]
b.map(returnsFourteen);
> [14, 14, 14, 14]

我期望a.map(returnsFourteen)返回[14, 14, 14, 14] (与b.map(returnsFourteen)相同,因为根据MDN page on arrays

如果传递给数组构造函数的唯一参数是介于0和2**32-1 (包括0和2**32-1)之间的整数,则会使用该数量的元素创建一个新的JavaScript数组。

我将其解释为a应该有4个元素。

这里我漏掉了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-27 23:08:18

当您像这样创建数组时:

代码语言:javascript
复制
var arr1 = new Array( 4 );

您得到一个长度为4的数组,但该数组没有元素。这就是map不转换数组的原因--数组没有要转换的元素。

另一方面,如果你这样做了:

代码语言:javascript
复制
var arr2 = [ undefined, undefined, undefined, undefined ];

你得到的数组的长度也是4,但它有4个元素。

请注意,没有元素和具有值为undefined的元素之间的区别。不幸的是,在这两种情况下,属性访问器表达式的计算结果都是undefined值,因此:

代码语言:javascript
复制
arr1[0] // undefined
arr2[0] // undefined

但是,有一种方法可以区分这两个数组:

代码语言:javascript
复制
'0' in arr1 // false
'0' in arr2 // true
票数 15
EN

Stack Overflow用户

发布于 2012-07-27 23:08:09

代码语言:javascript
复制
var a = new Array(4);

这定义了一个新的数组对象,显式长度为4,但没有元素。

代码语言:javascript
复制
var b = [undefined, undefined, undefined, undefined];

这定义了一个隐式长度为4的新数组对象,其中包含4个元素,每个元素的值都为undefined

docs

回调仅对已赋值的数组索引调用;对于已删除或从未赋值的索引不调用。

对于数组a,没有已赋值的元素,因此它不执行任何操作。

对于数组b,有四个元素已被赋值(是的,undefined是一个值),因此它将所有四个元素映射到数字14

票数 10
EN

Stack Overflow用户

发布于 2012-07-27 23:16:06

new Array(len)创建一个空数组,并执行一些不同于用undefined值填充它的操作:它将其长度设置为len。因此,它被翻译成这样的代码:

代码语言:javascript
复制
var newArr = [];
newArr.length = len;

让我们来享受一下newArr的乐趣(假设len = 4):

代码语言:javascript
复制
newArr.length; //4
newArr[1] === undefined; //true
newArr.hasOwnProperty(1); //false

这是因为虽然有4个项目,但它不包含这4个项目中的任何一个。想象一下一个空的弹夹:它有空间,比如说,可以容纳20颗子弹,但它不包含任何一个。它们甚至没有设置为值undefined,它们只是设置为are...undefined (这有点令人困惑)。

现在,Array.prototype.map愉快地遍历您的第一个数组,叫声和口哨,每当它看到一个数组项时,它就会对它调用一个函数。但是,当它沿着空的弹夹走时,它看不到子弹。当然,有子弹的空间,但这并不意味着它们的存在。在这里,没有值,因为映射到该值的键不存在。

对于第二个用undefined值填充的数组,值是undefined,键也是。在b[1]b[3]内部有一些东西,但是没有定义;但是Array.prototype.map并不关心,只要它有一个键,它就可以对任何值进行操作。

对于规范中的进一步检查:

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11690471

复制
相关文章

相似问题

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