代码之家  ›  专栏  ›  技术社区  ›  Solo

将数组索引处的值更改为false是否会使数组稀疏?

  •  0
  • Solo  · 技术社区  · 5 年前

    稀疏数组示例:

    // first
    let array = new Array(3);
    // second 
    let array = [1,,3];
    // third
    let array = [1, 2, 3]; // not sparse
    delete array[1]; // now it is
    // fourth
    let array = [1,2 3]; // not sparse
    array[1000] = 'foo'; // now it is
    

    是否将现有值设置为 undefined null 也让它稀疏?


    我有一个对象数组,我需要在不使其成为稀疏的情况下以某种方式表示空槽,因为它在现代浏览器引擎中被标记为稀疏,查找速度与对象键查找差不多-它需要遍历原型链(比索引查找慢得多)。

    1 回复  |  直到 5 年前
        1
  •  2
  •   CertainPerformance    5 年前

    不。数组对象在该数组索引处仍有自己的属性:

    const arr = [1, 2, 3];
    arr[0] = null;
    arr[1] = undefined;
    console.log(arr.hasOwnProperty('0'));
    console.log(arr.hasOwnProperty('1'));

    与稀疏数组相比,稀疏数组不:

    const arr = [ ,  , 3];
    console.log(arr.hasOwnProperty('0'));
    console.log(arr.hasOwnProperty('1'));

    然后在现代浏览器引擎中将其标记为稀疏,查找速度与对象键查找几乎相同-它需要遍历原型链(比索引查找慢得多)。

    正常非稀疏阵列的存取指标 如果在实例上找不到原型链,则必须遍历原型链(尽管几乎永远找不到):

    Object.prototype[4] = 'foo';
    const arr = [0, 1];
    console.log(arr[4]);

    如果我是你,我会使用一个带有数字标记的对象,以避免稀疏数组。如果脚本中存在性能瓶颈,那么几乎肯定不会出现在这一段代码中(这意味着担心这里的性能并没有真正的帮助)。