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

cab*_*bot 4 javascript arrays underscore.js

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

rai*_*7ow 5

实际上,你得到一个数组undefined- 并且传入的函数map甚至不会被触发一次.这是因为与创建数组new Array(Number)构造有点怪-即使它的长度设置正确,但实际上并没有0,1等性能:

var arr = Array(5);
console.log(arr.length); // 5
console.log('0' in arr); // false
Run Code Online (Sandbox Code Playgroud)

这就是为什么,即使普通的旧版本for (var i = 0; i < arr.length; i++)可以迭代这个数组,for (var i in arr)也行不通:

for (var i in arr) {
   console.log(i); // won't be called even once!
}
Run Code Online (Sandbox Code Playgroud)

而且,我认为,这与Array.map(映射_.map)时的情况相似:

var newarr = arr.map(function(el) {
   console.log(el); // nope, still nothing
});
console.log(newarr); // [undefined x 5]
Run Code Online (Sandbox Code Playgroud)

那么创建这样一个数组的正确方法是什么?这里是:

var rightArr = Array.apply(0, Array(5)); // ah, the pure magic of apply!
// and here goes an array of randoms:
var randArr = rightArr.map(Math.random);
Run Code Online (Sandbox Code Playgroud)

...但当然使用_.times是这种情况下的方法.)