我想生成一个给定长度的空数组,并用一些数字填充它。生成具有四个顺序数字元素的数组的一种方法是:
var x = Array.apply(null, {length: 4}).map(function(item, index){return index;})
但是,当我看到Array.apply(null, {length: 4})
时,我想可以用new Array(4)
代替它,但事实并非如此。快速测试会产生以下结果:
>> console.log((new Array(4)))
<< [ <4 empty items> ]
>> console.log(Array.apply(null, {length: 4}))
<< [ undefined, undefined, undefined, undefined ]
这意味着我可以.map
,但不能new Array
。
Array.apply(null, {})
和#include <stdio.h>
int *ARRAY_OF_VARIABLES[1];
int initalizeVariables() {
int i = 0;
ARRAY_OF_VARIABLES[0] = &i;
return i;
}
int main(void)
{
int test = initalizeVariables();
test = 1;
printf ("Test: %d, ARRAY_OF_VARIABLES[0]: %d\r\n", test, (int)*ARRAY_OF_VARIABLES[0]);
}
之间的区别是什么?我以为都是创建给定长度的数组对象?
答案 0 :(得分:4)
apply
将上下文作为第一个参数,并将数组状的参数列表作为第二个参数。然后,它以iterable作为参数调用函数(Array
)。
Array.apply(null, [1, 2])
// Same as
Array(1, 2)
// Or
[1, 2]
现在,如果您将对象传递为类似数组的对象,它将仍然像这样迭代它:
function apply(context, args) {
for(var i = 0; i < args.length; i++) {
/*...*/ args[i];
}
}
因此,如果您通过{ length: 4 }
,它将迭代四次,并以undefined
作为参数,因此结果如下:
Array.apply(null, { length: 4 })
// Same as
Array(undefined, undefined, undefined)
因此,数组插槽不是空的,而是未定义的,并且由于map
仅跳过空插槽,它将遍历第二个数组的每个条目。
顺便说一句,可读性更高:
Array.from({length: 4 }, (_, i) => i)
// [0, 1, 2, 3]
答案 1 :(得分:3)
答案需要深入研究Array
对象的机制。
new Array(4)
创建一个长度为4但没有项目的数组(稀疏数组)
Array.apply(null, {length: 4})
创建一个包含4个未定义元素的数组。
第二个使用一些技巧:
apply
调用具有给定上下文和数组中提供的参数的函数。
Array
,当直接作为函数调用时,会根据作为参数获得的元素创建一个数组,例如:
\> Array(1,2,3)
[ 1, 2, 3 ]
\> Array(...[1,2,3])
[ 1, 2, 3 ]
\> Array(...new Array(4))
[ undefined, undefined, undefined, undefined ]
那么Array.apply(null, {length: 4})
为何等同于Array.apply(null, new Array(4)
?
apply
通过查看长度然后获取相关参数来解析参数数组。 {length: 4}.length
是4,所以需要
{length:4}[0]
{length:4}[1]
{length:4}[2]
{length:4}[3]
全部为undefined
。
答案 2 :(得分:0)
不同之处在于
new Array(4)
不会初始化阵列中的插槽。它仅设置数组的length属性。 Array.apply(null, {length: 4})
将每个插槽初始化为undefined。