我一直在玩使用画布生成图像滤镜,我试图通过从头开始预分配整个矩阵来提高速度。
这段代码是我尝试过的第一件事:
var N = 3
var matrix = new Array(N).map(function () { return new Array(N) })
// [ undefined x 3 ]
不幸的是,这并没有达到我的预期。
我的预期结果由以下代码给出:
N = 3;
matrix = [undefined,undefined,undefined].map(function () { return new Array(N) })
// [Array[3], Array[3], Array[3]]
显然,预分配可以用另一种方式完成。这似乎可能是因为在javascript的实现中为了性能而进行了一些切角。
任何人都知道为什么第一个例子与第二个例子没有做同样的事情?
环境检查:
操作系统:OSX Yosemite
浏览器:Chrome,Firefox Dev(两者都相同)
答案 0 :(得分:3)
问题是new Array(n)
以及Array(n)
(which are equivalent)会创建稀疏数组。不幸的是,functions like .forEach
and .map
do not iterate over sparse sections of arrays,这就是为什么你会看到这种行为。
您可以使用trick来初始化特定大小的密集数组:
> var arr = Array.apply(null, {length: N});
> console.log(arr);
[undefined, undefined, undefined]
一旦你有一个密集阵列,你可以正确使用.map
:
var matrix = Array.apply(null, {length: N}).map(function() {
return Array.apply(null, {length: N});
});