zoukankan      html  css  js  c++  java
  • javascript中的稀疏数组(sparse array)和密集数组

    学习underscore.js数组相关API的时候。遇到了sparse array这个东西,曾经没有接触过。

    这里学习下什么是稀疏数组和密集数组。


    什么是密集数组呢?在java和C语言中,数组是一片连续的存储空间,有着固定的长度。增加数组事实上位置是address。长度为n。那么占用的存储空间是address[0],address[1],address[2].......address[n-1]。即数组元素之间是紧密相连的,不存在空隙。例如以下的js代码创建的就是一个密集数组

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

    什么是稀疏数组呢?与密集数组相反。javascript并不强制要求数组元素是紧密相连的,即同意间隙的存在。例如以下的js代码是合法的:

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

    1、创建稀疏数组

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

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

    说白了js中建立稀疏数组非常easy,仅仅要你有益让数组元素之间存在间隙就可以。如

    var arr = []; 
    arr[0] = 0;
    arr[200] = 200;

    2、创建密集数组

    能够看到js中的数组一般都是稀疏的。一般来说稀疏数组的遍历比較麻烦。

    var dense = Array.apply(null, Array(3)); 
    这行代码等同于var  dense = Array(undefined, undefined, undefined) ;呵呵是不是认为非常奇怪,这样的方式跟稀疏数组没有什么区别。

    看代码:

    //稀疏数组
     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的数组元素是连续的

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

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

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


  • 相关阅读:
    区别@ControllerAdvice 和@RestControllerAdvice
    Cannot determine embedded database driver class for database type NONE
    使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
    Markdown语法笔记
    Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
    Mysql 查看连接数,状态 最大并发数(赞)
    OncePerRequestFilter的作用
    java连接MySql数据库 zeroDateTimeBehavior
    Intellij IDEA 安装lombok及使用详解
    ps -ef |grep xxx 输出的具体含义
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5307816.html
Copyright © 2011-2022 走看看