我在Firefox-3.5.7/Firebug-1.5.3和Firefox-3.6.16/Firebug-1.6.2中观察到了这一点
当我开火萤火虫时:
var x = new Array(3)
console.log(x)
// [undefined, undefined, undefined]
var y = [undefined, undefined, undefined]
console.log(y)
// [undefined, undefined, undefined]
console.log( x.constructor == y.constructor) // true
console.log(
x.map(function() { return 0; })
)
// [undefined, undefined, undefined]
console.log(
y.map(function() { return 0; })
)
// [0, 0, 0]Run Code Online (Sandbox Code Playgroud)
这里发生了什么?这是一个错误,还是我误解了如何使用new Array(3)?
根据MDN文档,new Array(length)我可以初始化具有给定长度的数组:
var a = new Array(10);
a.length; // => 10
a; // => [undefined x 10]
Run Code Online (Sandbox Code Playgroud)
但是,显然我不能使用诸如map(...)新数组之类的方法,即使以其他方式构造的数组工作正常:
a.map(function() { return Math.random(); });
// => [undefined x 10] -- wtf?
[undefined, undefined].map(function() { return Math.random(); });
// => [0.07192076672799885, 0.8052175589837134]
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我从这个经验(并在网上搜索)中了解到,具有长度的数组构造函数是一个无法解释的行为的黑洞,但ECMA 262规范是否提供了解释?
我map对使用以下创建的数组执行ping操作感到困惑new:
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]
Run Code Online (Sandbox Code Playgroud)
我期望a.map(returnsFourteen)返回[14, 14, 14, 14](同样的b.map(returnsFourteen),因为根据数组上的MDN页面:
如果传递给Array构造函数的唯一参数是0到2**32-1(含)之间的整数,则会创建具有该数量元素的新JavaScript数组.
我认为这意味着a应该有4个元素.
我在这里错过了什么?
我试图使用map生成一些随机数据.令我惊讶的是,我无法弄清楚为什么这段代码不起作用.
请考虑以下代码段,它按预期工作:
const empty = [undefined, undefined];
const rand = empty.map(item => Math.random());
Output: [0.4774752874308936, 0.8482276976659398]
Run Code Online (Sandbox Code Playgroud)
我试图简化一下并执行以下操作
const rand = Array(2).map(item => Math.random())
Output: [undefined × 2]
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样.显然,由Array(n)和[]生成的两个数组都是典型的数组,并且具有所有原型方法.
Array(2) instanceof Array
true
[undefined, undefined] instanceof Array
true
Array.isArray(Array(2))
true
Array.isArray([undefined, undefined])
true
Run Code Online (Sandbox Code Playgroud)
有人能指出我在哪里错了吗?
我想创建具有固定长度的空数组,然后使用.map它来返回新数组.但是,它没有按预期工作.
根据mdn docs:
如果传递给Array构造函数的唯一参数是0到232-1(含)之间的整数,则返回一个长度设置为该数字的新JavaScript数组.
new Array(3)回报[undefined × 3].不应该是:[undefined, undefined, undefined]?
让我们考虑以下示例:
1)不工作.
var a = new Array(3);
a.map((x, i) => i); // [undefined × 3]
Run Code Online (Sandbox Code Playgroud)
2)工作.
var a = Array.apply(null, new Array(3));
a.map((x, i) => i); // [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)
我在最新的Google Chrome Canary上进行了测试.
我发现了奇怪的行为(在Chrome上测试)
[1,2].map(function() { console.log(arguments); })
// [1, 0, Array[2]]
// [2, 1, Array[2]]
// [undefined, undefined]
Run Code Online (Sandbox Code Playgroud)
那没关系 - 好在文档中但是
(new Array(20)).map(function() { console.log(arguments); })
//[undefined × 20]
Run Code Online (Sandbox Code Playgroud)
它不使用回调(没有动作,debugger内部不起作用等).为什么??
语法new Array(arrayLength)应该创建具有给定长度的数组.确实如此.但是有什么用.map?
一方面,rangeES6 中缺乏与 Python 3 相当的东西是一个烦恼。另一方面,有很多解决方法。我的问题是为什么我尝试的一种解决方法实际上有效。为了显示:
[...Array(10).keys()];
Run Code Online (Sandbox Code Playgroud)
如果我发现这个神秘的原因并不明显,请注意,Array(10).keys()至少表面上是空的。
我知道这会浪费地创建两个数组,就像大多数流行的解决方法一样,并且(以创建生成器函数为代价)使用生成器可以避免这种情况。例如,
[...(function*(){let i = 0; while(i<10) yield i++;})()];
Run Code Online (Sandbox Code Playgroud)
我的问题只是关于为什么第一个解决方法会产生所需的结果。
编辑:
从答案来看,有人认为,评价Array(10)等同于评价Array.apply(null,Array(10))。他们不是。例如,.hasOwnProperty(0)是false针对前者,但true针对后者。然而,我愿意被说服,他们在某些重要的方面是相同的,因为我在某些关键点上显然缺乏理解。我怀疑答案是迭代键的结果是由length两者共享的属性决定的,而不是由已定义的实际数组索引决定的。如果是这样,我想知道这种行为是否正常。
我想制作一个0到1之间的随机数组,所以我试过:
var randList = _.map(new Array(5), Math.random);
Run Code Online (Sandbox Code Playgroud)
但我没有得到我预期的随机元素列表,而是:
console.log(JSON.stringify(randList));
"[null,null,null,null,null]"
Run Code Online (Sandbox Code Playgroud)
为什么我得到一个null数组而不是随机数?
我希望以下代码返回 [1,1,1,1...]
(new Array(10)).map(function() { return 1;})
Run Code Online (Sandbox Code Playgroud)
但它回来了[, , , , , ...].
此外,
(new Array(10)).length == 10和(new Array(10))[0] == undefined是真实的.
而且z = function(){return 0;};表达z(undefined) === 0也是如此.
然而,我注意到它[,,,,,,,,,,].map(function() { return 1; })也会回归[,,,,....].
有谁能解释为什么?
假设我们有3个数组:
var arr1 = [undefined, undefined, undefined];
var arr2 = [, , ,];
var arr3 = new Array(3);
Run Code Online (Sandbox Code Playgroud)
它们在JavaScript中都是相同的吗?如果我们想undefined用作固定大小数组的默认值,我们可以互换使用它们吗?