长度为的新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没有进行如此仔细的区分。