• javascript中稀疏数组和密集数组


    密集数组

    数组是一片连续的存储空间,有着固定的长度。加入数组其实位置是address,长度为n,那么占用的存储空间是address[0],address[1],address[2].......address[n-1]。即数组元素之间是紧密相连的,不存在空隙。如下的js代码创建的就是一个密集数组

    1
    var data = [3,1,6,9,2];

    稀疏数组

    与密集数组相反,javascript并不强制要求数组元素是紧密相连的,即允许间隙的存在。如下的js代码是合法的:

    1
    2
    3
    4
    5
    var sparse = new Array();
    sparse[0] = 0;
    sparse[3] = 3;
    alert(sparse[0]);//输出0
    alert(sparse[1]);//输出undefined

    1、创建稀疏数组

    如下代码创建了一个固定长度的稀疏数组

    1
    2
    3
    4
    var a = new Array(3);
    a[2] = 1;
    alert(a[0]);//undefined
    alert(a[2]);//1

    js中建立稀疏数组很容易,只要你故意让数组元素之间存在间隙即可。如

    1
    2
    3
    var arr = [];
    arr[0] = 0;
    arr[200] = 200;

    2、创建密集数组

    可以看到js中的数组一般都是稀疏的,一般来说稀疏数组的遍历比较麻烦。

    1
    var dense = Array.apply(null, Array(3));

    这行代码等同于var  dense = Array(undefined, undefined, undefined) ;这种方式跟稀疏数组没有什么差别。看代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //稀疏数组
    var array = new Array(3);
    array[2] = "name";
    for(var a in array)
    {
      console.log("index=" + a + ",value=" + array[a]);
    }
    // 密集数组
    var dense = Array.apply(null, Array(3));
    dense[2] = "name";
    for(var a in dense)
    {
      console.log("index=" + a + ",value=" + dense[a]);
    }

    用F12观察控制台输出结果是:

    可以看到确实是有差别的:稀疏数组只遍历了一次(因为只有一个元素),密集数组遍历了3次。

    3、总结

    JavaScript中的数组并不像我们在C或java等语言中遇到的常规数组,在js中数组并不是起始地址+长度构成的一片连续的地址空间。

    javascript中数组其实就是个对象,只不过会自动管理一些"数字"属性和length属性罢了。

    说的更直接一点,JavaScript中的数组根本没有索引,因为索引应该是数字,而JavaScript中数组的索引其实是字符串。

    arr[1]其实就是arr["1"],给arr["1000"] = 1,arr.length也会自动变为1001。

    这些表现的根本原因就是:JavaScript中的对象就是字符串到任意值的键值对。

    虽然稀疏数组和密集数组差别不大,javascript也没有语法强制数组是稀疏的还是密集的,这不过是概念上的区分。

    最佳实践是:就把js数组当成是java或C中的数组,由我们程序员来负责让js的数组元素是连续的。

    1
    var array = [1,2,3,4];

    如:

    1
    var array = new Array();array[0]=0;array[1]=1;

    这样创建的js数组,就符合我们熟悉的数组了。

  • 相关阅读:
    DirectX11 With Windows SDK--14 深度测试
    DirectX11 With Windows SDK--12 深度/模板状态、平面镜反射绘制
    DirectX11--深入理解HLSL常量缓冲区打包规则
    JS学习笔记7_表单脚本
    JS学习笔记6_事件
    JS学习笔记5_DOM
    JS学习笔记4_BOM
    JS学习笔记3_函数表达式
    JS学习笔记2_面向对象
    JS学习笔记1_基础与常识
  • 原文地址:https://www.cnblogs.com/zhuochong/p/11640098.html
Copyright © 2020-2023  润新知