对使用new
创建的数组执行map
ping的结果让我感到困惑
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个元素。
这里我漏掉了什么?
发布于 2012-07-27 23:08:18
当您像这样创建数组时:
var arr1 = new Array( 4 );
您得到一个长度为4
的数组,但该数组没有元素。这就是map
不转换数组的原因--数组没有要转换的元素。
另一方面,如果你这样做了:
var arr2 = [ undefined, undefined, undefined, undefined ];
你得到的数组的长度也是4
,但它有4个元素。
请注意,没有元素和具有值为undefined
的元素之间的区别。不幸的是,在这两种情况下,属性访问器表达式的计算结果都是undefined
值,因此:
arr1[0] // undefined
arr2[0] // undefined
但是,有一种方法可以区分这两个数组:
'0' in arr1 // false
'0' in arr2 // true
发布于 2012-07-27 23:08:09
var a = new Array(4);
这定义了一个新的数组对象,显式长度为4,但没有元素。
var b = [undefined, undefined, undefined, undefined];
这定义了一个隐式长度为4的新数组对象,其中包含4个元素,每个元素的值都为undefined
。
从docs
回调仅对已赋值的数组索引调用;对于已删除或从未赋值的索引不调用。
对于数组a
,没有已赋值的元素,因此它不执行任何操作。
对于数组b
,有四个元素已被赋值(是的,undefined
是一个值),因此它将所有四个元素映射到数字14
。
发布于 2012-07-27 23:16:06
new Array(len)
创建一个空数组,并执行一些不同于用undefined
值填充它的操作:它将其长度设置为len
。因此,它被翻译成这样的代码:
var newArr = [];
newArr.length = len;
让我们来享受一下newArr
的乐趣(假设len = 4
):
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
并不关心,只要它有一个键,它就可以对任何值进行操作。
对于规范中的进一步检查:
new Array(len)
:http://es5.github.com/#x15.4.2.2Array.prototype.map
:http://es5.github.com/#x15.4.4.19 (密切关注步骤8.b)https://stackoverflow.com/questions/11690471
复制相似问题