Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
长度为的新JavaScript数组是否不可用?_Javascript - Fatal编程技术网

长度为的新JavaScript数组是否不可用?

长度为的新JavaScript数组是否不可用?,javascript,Javascript,根据,我可以初始化具有给定长度的数组,如下所示: var a=新数组(10); a、 长度;//=>10 a、 //=>[未定义x10] 但是,显然我不能在新数组上使用诸如map(…)之类的方法,即使以其他方式构造的数组工作正常: a.map(函数(){return Math.random();}); //=>[undefined x 10]--wtf? [undefined,undefined].map(函数(){return Math.random();}); // => [0.07192

根据,我可以初始化具有给定长度的数组,如下所示:

var a=新数组(10);
a、 长度;//=>10
a、 //=>[未定义x10]
但是,显然我不能在新数组上使用诸如
map(…)
之类的方法,即使以其他方式构造的数组工作正常:

a.map(函数(){return Math.random();});
//=>[undefined x 10]--wtf?
[undefined,undefined].map(函数(){return Math.random();});
// => [0.07192076672799885, 0.8052175589837134]
为什么会这样

我从这次经验(以及搜索web)中了解到,长度为的数组构造函数是一个无法解释的行为黑洞,但ECMA262规范是否提供了解释?

新数组(10)
不会返回一个填充了10
未定义的
的数组。相反,它返回一个不含元素的数组,其
length
属性为
10

请看区别:

var arr1=新数组(1),
arr2=[未定义];
arr1.length==arr2.length;//两者都是'1'`
arr1[0]==arr2[1];//两者都是“未定义的”`
arr1.hasOwnProperty(0);//假的
arr2.hasOwnProperty(0);//真的
因此,ECMAScript 5数组方法跳过那些不存在的属性。具体地说,当它们从
0
迭代到
length
时,它们检查数组的
[[HasProperty]]
内部方法

您可以使用ECMAScript 6轻松修复它(可以是):

新数组(10.fill().map(Math.random);

本来也会这么说,但你比我先说。很好,但是实例化一个长度为10个w/o元素的数组有什么意义?有一个有用的例子吗?@DontVoteMeDown如果你要构建一个巨大的数组并告诉浏览器它将有多少个元素,浏览器可以在内存中保留空间。在插入每个元素时增加大小可能比较慢。啊,因此这种语言似乎混淆了“长度”和“容量”(尽管后续的
推送(…)
将在索引“length+1”(wtf)处插入)?这似乎只是语言中考虑不周的一部分。不要这样认为:容量是某个东西可以包含的最大数量,而长度是由指定的某个东西的范围确定的距离。这是稀疏数组设计中固有的,可以做到,为什么不允许呢?虽然不是很常用,但我可以这样想我猜
[undefined x 10]
只是控制台中的一个表示,表示您有一个10大小的空数组。在Firefox中,它只是表示
数组[]
.FWIW
[undefined,undefined].map(函数(){return Math.random();});
不会对未定义的元素执行任何操作,这就是它返回浮点数的原因。;“它不会为未定义、已删除或从未赋值的索引调用。”@Andy:我不知道,此代码段的行为与预期的一样-->
[undefined].map(函数(x){return“OK:+x;})//=>[“确定:未定义”]
。也许这就是“未定义值”和“[索引]之间的区别从未分配过值。
未定义
是一个值,
可以解释为
未定义
,但它没有价值。我认为问题更多地与人类语言有关,而不是Javascript语言本身。
[,未定义][1]
为属性分配了
未定义的值,
[,未定义][0]
未定义它是一个
并且没有为属性指定值,您可以将其解释为
未定义
,但它实际上没有定义。ECMA5方法实际上检查属性是否有指定值,并忽略孔。希望这有意义。:)@Xotic750:是的,我认为问题在于JS语言重载了术语“长度”来表示“元素计数”(在大多数情况下)或“容量”(在这个问题的上下文中)。例如,可以用正容量初始化,但这对长度(java中的大小)没有影响。显然JS没有进行如此仔细的区分。