JavaScript复习笔记(三)数组及数组API

一、数组

分为两种  关联数组:可以自己定义下标名称的数组

          索引数组:自动生成下标的数组都是索引数组

1、创建、赋值和取值

①创建:4种:

      1. var 变量名=[];   创建一个空数组对象

      2. var 变量名=[值1,值2,...](常用)创建数组同时,为数组指定初始元素(数组中每个值)

        数组是引用类型的对象,变量中保存了数组对象的地址值

      3. var arr=new Array();  创建一个空数组对象

         new:创建一个新对象,并返回新对象地址,Array:js中的数组类型

         new Array()-->创建一个数组类型的新对象,并返回新对象的地址。

      4. var arr=new Array(n);-->创建n个元素的数组,new Array(值1,值2,...)

② 赋值:数组变量[i]=新值;

找到数组:使用变量等效于直接使用变量引用的数组对象

      数组对象中,每个元素都有一个下标:每个元素的位置号,

下标从0开始,到元素个数-1结束

③ 取值: 数组变量[i]

数组变量[i]-->获得i位置元素中的值

2、js数组下标越界不会出错!

      为不存在的位置赋值:不会出错!会自动创建指定下标的新元素。

      从不存在的位置取值:不会出错!也不会增加新元素,而是返回undefined

3、 .length属性:数组是对象,封装了一组数据,并提供了对数据的操作方法

①常用方式  arr[arr.length-1]: 获得任意长度数组中的最后一个元素

            arr[arr.length]=新值: 向数组末尾追加一个新元素

            改小length的值,可删除末尾元素

②获得数组中的元素个数不一定等于实际的元素个数

例:var a=[];a[5]=5;console.log(a.length);console.log(a[2]);//输出:6 undefined

实际只赋值一个元素,length却为6,其余未被赋值都为undefined

4、数组遍历:从下标0位置开始,依次取出每个元素,反复执行相同的操作。

① 循环条件:下标i<arr.length②循环变量:下标i, 从0开始,每次增1,直到arr.length-1③ 循环体:xxx

例  var a=[1,1,2,3,5,8];

for(var i=0;i<a.length;i++){

console.log(a[i]);

}     //输出1 1 2 3 5 8

5、关联数组:可以自己定义下标名称的数组

 ①创建关联数组: var arr=[];

               arr["key1"]=value1;

               arr["key2"]=value2;                      

例 var SLP=[];

SLP["yanzhi"]=100

SLP["caihua"]=100

SLP["English"]=0

 

②如何访问关联数组中的元素:arr["key"]

关联数组: 下标是不能重复的

           优势:精确定位某个下标的位置,不用遍历

        索引数组:下标自动分配,无意义(常见)

           缺点:要想按内容查找元素,只能从头开始遍历!

③遍历关联数组:依次遍历arr中每个元素,将当前元素的下标存入key中

关联数组中的.length属性失效!

        for(var key in arr){

      key;    //得到当前元素的下标

          arr[key]; //得到当前元素的值!

       }

例:var SLP=[];

SLP["yanzhi"]=100;

SLP["caihua"]=100;

SLP["English"]=0;

for(var key in SLP){

 console.log(key+":"+SLP[key]);

};

//结果: yanzhi:100   caihua:100   English:0

6、冒泡排序

var a=[7,16,8,6,15]

for(i=1;i<a.length;i++){         

for(j=0;j<a.length-i;j++){

if(a[j]>a[j+1]){

max=a[j];

a[j]=a[j+1];

a[j+1]=max;

}}}

console.log(a);// [6, 7, 8, 15, 16]

7、数组API:

①无法直接修改原对象,而返回新对象API(常考)

toString()   join()   concat()    slice()

②数组 to String:2种:

      var str=arr.toString();-->输出数组中的内容,每个元素用逗号分隔

      var str=arr.join("连接符")(常用)-->输出数组中的内容,自定义元素间连接符

        使用的2种固定套路

           1. 将字符组成单词:arr.join("")        //效果:abcd

           2. 将单词组成句子:arr.join("  ")      //效果:a b c d

③拼接:var newArr=arr.concat(另一个数组,值1,值2...)

例:a=[1,2,3,4];b=[7,8,9];

var c=a.concat(10,b);

console.log(a);  //a不改变,说明不能直接修改原对象

console.log(c);

//输出 [1, 2, 3, 4]   [1, 2, 3, 4, 10, 7, 8, 9]

④截取:var subArr=arr.slice(starti[,endi+1]);含头不含尾,starti和endi代表数组下标

第二个参数可以省略,代表一直截取到结尾,参数可以取负值,负值从右数,从-1数起

例:var arr=[0,1,2,3,4,5,6];

console.log(arr.slice(0,3));   //输出 [0, 1, 2],含头不含尾

console.log(arr.slice(-1,-3));  //输出  []   ,方向写反了,无法从后向前截取

console.log(arr.slice(-3,-1));  //输出 [4, 5] ,取负数最后一位下标为-1,也含头不含尾

 

  ⑤ splice: 删除 、插入、替换(数组最强大的API)

      删除:arr.splice(starti,删除个数)

      插入:arr.splice(starti,0,新值1,...)

      替换:arr.splice(starti,删除个数,新值1,...)

基本结构

   arr.splice (     3,                     2,                21,22,23,24);

          从第三位开始(含头)     删两个         替换为21,22,23,24

例:arr=[11,12,13,14,15,16,17,18,19];

arr.splice (3,2,21,22,23,24);

console.log(arr);

//输出 [11, 12, 13, 21, 22, 23, 24, 16, 17, 18, 19]

 

  ⑥ arr.reverse(); 颠倒数组中所有元素

arr=[11,12,13,14,15,16,17,18,19];

console.log(arr.reverse());   // [19, 18, 17, 16, 15, 14, 13, 12, 11]

⑦arr.sort()按Unicode码排序

例:var a=[1,12,4,46,3,35];

console.log(a.sort());    // [1, 12, 3, 35, 4, 46]

如何让sort()方法按数值大小排序,定义一个比较器函数

function compare(a,b){return a-b}

例:  var a=[1,12,4,46,3,35];

function compare(a,b){return a-b}

console.log(a.sort(compare));  //[1, 3, 4, 12, 35, 46]

8、栈和队列:js中没有真正的栈和队列的类型,一切都是用数组对象模拟的

   一) 栈:只能从一端进出的数组,另一端封闭 (FILO first in last out 先进后出)

      ① 末尾出入栈:已入栈元素的下标不再改变

         入栈: arr.push(新值1,...)

         出站: arr.pop()

var a=[1,12,4,46,3,35];  a.pop();  console.log(a);  // [1, 12, 4, 46, 3]

var a=[1,12,4,46,3,35];  a.push(11,22);  console.log(a);  // [1, 12, 4, 46, 3, 35, 11, 22]

      ② 开头出入栈:每次入栈新元素时,已入栈元素的位置都会向后顺移。

        入栈:arr.unshift(新值1,...);

        出站:arr.shift();

var a=[1,12,4,46,3,35];  a.unshift(11,22);  console.log(a);  // [11, 22, 1, 12, 4, 46, 3, 35]

var a=[1,12,4,46,3,35];  a.shift();  console.log(a);  // [12, 4, 46, 3, 35]    

二) 队列:只允许从末尾进入数组,必须从开头出数组(FIFO first in first out 先进先出)             结尾入队列:arr.push();

              开头出队列:arr.shift();

9、二维数组:数组中的元素,又引用了另一个子数组对象

  ① 使用二维数组场景2种:

        要保存横行竖列的二维数据

        要保存上下级关系的数据时

② 如何创建二维数组2种:

       1. 先创建空数组,再赋值:

          var arr=[];

          arr[0]=["石家庄","保定","唐山"];

      arr[1]=["德州","济南","烟台"];

       2. 创建数组时,同时初始化子数组:     

          var data=[

          [0,2,2,4],        //第0行

          [2,4,4,8],        //第1行

          [16,32,16,8],     //第2行

          [4,2,128,4]       //第3行

          ];

    如何访问二维数组中的数据:arr[行下标][列下标]

        比如:data中第2行,第3个元素,data[1][2]

    强调:二维数组中,行下标不能越界!

          console.log(data[1][5]); //undefined

          console.log(data[5][1]); // Uncaught TypeError

③遍历二维数组:

固定套路:外层循环遍历行,内存循环遍历列

        var arr=[[...],[...]...]

    for(var r=0;r<arr.length;r++){

    for(var c=0;c<arr[r].length;c++){

      console.log(arr[r][c]);

            }

        }

 

猜你喜欢

转载自blog.csdn.net/shilipeng666/article/details/84072437