记笔记很有必要——相信我,大多数人的记忆力是不可靠的。

——《与时间做朋友》李笑来

数组

  • 值的有序集合

  • 弱类型

    • 数组中的元素可以是各种类型的

      • null

      • undefined

      • ...

  • 空间有限

    • 0~2^32-1( 42_9496_7295)

创建

字面量

var arr = [['ff',{ee:'dd'}],[e,dd]]
var arr = [,,] //2 undefined

new Array()

new Array(100);//100undefined
new Array(1,2,'hi',{'touch':'me'})//[1,2,'hi',{touch:'me'}]

添改查删

添加

  • .push(xx) //添加到后面

    • 返回添加后数组的数组长度

    • //等于 arr[arr.length] = xx

  • .unshift() //添加到前面

删除+输出

  • (单纯删除)

    • arr.length -= 1;//删除最后一元素

  • .shift() //把第一个牺牲出去

  • .pop() //把最后一个牺牲出去

delete

  • delete arr[0] // 相当于 arr[0] = undefined

迭代

for(;;)

for(i in arr)

  • 作为一个对象来遍历这个数组时

    • 当Array原型上定义了一个属性的时候,for i in arr一个数组的时候,将会把原型上的这个属性也遍历出来,不管这个数组是在这之前还是之后生成的。

      var arr = [1,2,3]
      Array.prototype.x = 'inherited'
      for(i in arr){
          console.log(i + ' ' + arr[i]);
      }
      //1 1
      //2 2
      //3 3
      //x 'inherited'
      • 解决方式

         for(i in arr){ 
            if(arr.hasOwnProperty(i){
            //do somethings
            } 
        }
    • 遍历的顺序不确定

      • 因为对象不是有序的。

数组的两种特殊形式

二维数组

遍历一个二位数组

通过嵌套的循环

var arr = [[0,1],[1,2],[2,3]]
for(var i =0;i<arr.length;i++){
    console.log('row ' + i)
    for(var j =0;j<arr[i].length;j++){
        console.log(arr[i][j]);
    }
}

应用

  • 二位平面定位

  • 三位空间点定位(使用三维数组

稀疏数组(不常用)

  • 内部的元素构不成一个连续序列

  • 一般length属性值比实际元素个数大

什么东西?

将数组比作一栋出租屋,里面按照输入的参数建了好几个房间。

除了部分建造时就不打算用来出租的空房间之外

如果存在没有人住的空房间

那么这个出租屋就是“稀疏出租屋”。

//按照输入的参数建了好几个房间
var apartment = [1,undefined,,4,'watch']

// 建造时就不打算用来出租的空房间
apartment[1]
// undefined 
1 in apartment
// true

// 没有人住的空房间
aprtment[2]
// undefined
2 in apartment
// false

// 稀疏出租屋
apartment;
// [1,undefined,,4,'watch']

怎么产生的?

这个空房间的产生可能由于:

  1. 建房子的时候输入的参数没有指明用途。var empty = [,,]

  2. 出租过程中赶走了某些房客。delete arr[1]

具体来说就是说: 存在某个空间没有元素的数组便是稀疏数组

怎么处理?

  • in

    • {number} in {arr} 将会确认 arr[number] 这个位置有没有元素存在。

  • arr[i] == undefined

    • 同检查元素是否存在


RDDcoding
151 声望17 粉丝

一心一行