JavaScript稀疏数组和稠密数组

1,102 阅读1分钟

JavaScript: sparse arrays vs. dense arrays

image.png

1、Sparse arrays 稀疏数组 稀疏数组,简单来说,就是数组元素的个数,跟数组长度不一致

image.png
当我们循环这个数组时, 就像黑洞
image.png

关于<权威指南>p147的错误

var a1 = [,,,];//数组是[undefined,undefined,undefined]  == > 这里是 错误的,应该是都是empty
var a2 = new Array(3);
0 in a1  //true:a1在索引0处有一个元素。  ==> 这里应该是false
0 in a2  //false

image.png

2、Dense arrays 稠密数组 我们可以使用这个小技巧来创建稠密数组

image.png
这个和我们这样是等价的 Array(undefined, undefined, undefined) 大都数情况下,稀疏数组和稠密数组没啥区别,除了在循环上
image.png

3、快速创建若干个稠密数组

Array.apply(null, Array(3)).map(Function.prototype.call.bind(Number))
Array.apply(null, Array(99)).map(function(x,i){ return Number.call(x,i)})

4、实际中的快速创建稠密数组,使用 underscore

_.range(3) // [ 0, 1, 2 ]
_.range(3).map(function () { return "a" }) // [ 'a', 'a', 'a' ]

underscorerange方法实现

_.range = function(start, stop, step) {
    if (stop == null) {
      stop = start || 0;
      start = 0;
    }
    if (!step) {
      step = stop < start ? -1 : 1;
    }

    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
      range[idx] = start;
    }

    return range;
  };

参考

  1. JavaScript: sparse arrays vs. dense arrays
  2. JavaScript权威指南,