相关疑难解决方法(0)

创建零填充JavaScript数组的最有效方法?

在JavaScript中创建任意长度零填充数组的最有效方法是什么?

javascript arrays

552
推荐指数
22
解决办法
32万
查看次数

JavaScript"new Array(n)"和"Array.prototype.map"怪异

我在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)

javascript arrays map-function

192
推荐指数
10
解决办法
4万
查看次数

是一个长度不可用的新JavaScript数组吗?

根据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规范是否提供了解释?

javascript

24
推荐指数
1
解决办法
798
查看次数

使用`new`创建的数组上的`map`行为感到困惑

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个元素.

我在这里错过了什么?

javascript arrays map new-operator

17
推荐指数
3
解决办法
661
查看次数

JavaScript Map:为什么这不起作用?

我试图使用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)

有人能指出我在哪里错了吗?

javascript arrays

17
推荐指数
1
解决办法
3462
查看次数

数组构造函数未按预期工作

我想创建具有固定长度的空数组,然后使用.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上进行了测试.

javascript

7
推荐指数
1
解决办法
175
查看次数

(new Array(x)).map stranges

我发现了奇怪的行为(在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

javascript arrays

7
推荐指数
1
解决办法
89
查看次数

使用扩展语法创建一系列自然数

一方面,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两者共享的属性决定的,而不是由已定义的实际数组索引决定的。如果是这样,我想知道这种行为是否正常。

javascript arrays iterator ecmascript-6

5
推荐指数
1
解决办法
2861
查看次数

为什么我不能使用_.map创建一个随机数组(new Array(n),Math.random)?

我想制作一个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数组而不是随机数?

javascript arrays underscore.js

4
推荐指数
1
解决办法
908
查看次数

(new Array(10)).map(function(){return 1;})返回[,,,,, ...]为什么?

我希望以下代码返回 [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; })也会回归[,,,,....].

有谁能解释为什么?

javascript

3
推荐指数
1
解决办法
526
查看次数

[undefined,undefined,undefined]和新的Array(3)如何在JavaScript中有所不同?

假设我们有3个数组:

var arr1 = [undefined, undefined, undefined];
var arr2 = [, , ,];
var arr3 = new Array(3);
Run Code Online (Sandbox Code Playgroud)

它们在JavaScript中都是相同的吗?如果我们想undefined用作固定大小数组的默认值,我们可以互换使用它们吗?

javascript arrays

-1
推荐指数
1
解决办法
66
查看次数