zoukankan      html  css  js  c++  java
  • JS 数组总结

      1     /**
      2      * JS数组
      3      * 类型:JS数组是无类型的,数组元素可以是任意类型
      4      * 索引:基于零的32位数值,索引(下标)范围:0 到 (2的32次方)-2 [即 0 到 4 294 967 294],
      5      *       即4 294 967 295个元素,在这个下标范围内,数组的 length 属性可以自动维护
      6      * 特性:
      7      * 1、动态;创建数组无需声明大小,其长度会根据需要动态增长或缩减
      8      * 2、连续性:JS数组可能是稀疏的,元素索引不一定要连续
      9      * 属性:length属性,表示数组长度(数组中数字索引的长度)
     10      */
     11 
     12     /**
     13      * 数组的创建:
     14      * 1、使用直接量字符创建
     15      * 2、调用构造函数 Array() 创建
     16      */
     17     //使用数组直接量创建数组
     18     var arr=[];
     19 
     20     // 数组的直接量的语法允许有可选逗号作结尾,直接量中被省略的值是不存在的,
     21     //访问时会输出 undefined, 且直接量中的值不一定要是常量,也可以是表达式
     22     var arr=[,,];
     23     console.log(arr);//[ <2 empty items> ] 这里数组为空,没有元素
     24     //解析:上面语句实际上与 var arr=[,]; 相同
     25     //第一个逗号左边和右边各有一个 item,第二个逗号可选(即可有可无)
     26 
     27     var num=1024;
     28     var arr=[undefined,undefined,++num];
     29     console.log(arr);//[ undefined, undefined, 1025 ]
     30     //解析:这里的两个元素值为:undefined (这里数组有值,并不为空,只不过值刚好为:undefined)
     31 
     32     //调用构造函数Array()创建数组
     33     var arr=new Array();//[]
     34     var arr=new Array(10);//[ <10 empty items> ] 指定数组长度为10
     35     //var arr=new Array(4294967296);//RangeError: Invalid array length
     36     //解析:数组索引范围(0 到 4 294 967 294),即4 294 967 295个元素,创建数组时超出范围报错
     37     var arr=new Array(123,"abc",{});//[ 123, 'abc', {} ] //显式指定多个数组元素
     38 
     39     /**
     40      * 数组元素的读写:
     41      * 数组是对象的特殊形式,使用方括号访问数组元素就像使用方括号访问对象的属性一样
     42      * 数组索引和对象属性的区分:
     43      * 1、所有索引都是属性名
     44      * 2、只有在范围内(0 到 (2的32次方)-2)的整数属性名才是索引
     45      * 3、因为所有数组都是对象,因此可以为数组创建任意名字的属性,如果使用的
     46      *    属性名是数组索引(范围内的整数),那么数组就会根据需要更行它的 length 属性值
     47      * 4、事实上数组索引仅仅是对象属性名的一种特殊情况,这意味着js数组没有"越界"错误概念
     48      *    即当试图查询对象(数组是对象)中不存在的属性时,不会报错,只会得到 undefined
     49      */
     50     var arr=[];
     51     arr[1]="num1";
     52     arr[2.000]="num2";//与 arr[2]="num2";相等
     53     arr[-1.23]=true;//超出范围,不是索引,是属性
     54     console.log(arr,arr[100]);
     55     //[ <1 empty item>, 'num1', 'num2', '-1.23': true ] undefined
     56     //解析:arr[0] 没有赋值,所以为空。arr[1],arr[2]对应数组索引。
     57     //最后面的 '-1.23': true 就跟对象中的键值对一样,可通过 arr[-1.23]/arr["-1.23"] 访问到
     58     //arr[100]超出当前数组的长度,但访问时不会报错,而是输出 undefined
     59 
     60 
     61     /**
     62      * 稀疏数组:
     63      * 稀疏数组就是包含从0开始的不连续的索引的数组
     64      */
     65     var arr=[];
     66     arr[20]="hello";
     67     console.log(arr,arr.length);//[ <20 empty items>, 'hello' ] 21
     68     //解析:虽然数组长度为 21,但是数组是稀疏的,只有一个元素,前面元素全部为空
     69 
     70 
     71  /**
     72   * 数组的长度 length 属性:
     73   * 更准确地说数组的 length 属性,表示的是数组中数字索引的长度,而不是数组中元素的个数
     74   */
     75 
     76   var arr=[];//一个空数组,length=0
     77   arr[3]="num3",arr["test"]="hello world",arr[-100]="-100";
     78   console.log("length:"+arr.length,arr);
     79   //length:4 [ <3 empty items>, 'num3', test: 'hello world', '-100': '-100' ]
     80   //解析:数组前面3个元素为空,arr[3]在上面赋值为 num3,后面两个不是索引,而是被当成对象属性
     81   //数字索引有4个(arr[0]、arr[1]、arr[2]、arr[3]),也就说明:length 表示的是数组中数字索引的长度(这个就是数组长度)
     82   //由此引出了下面这样一个特殊行为
     83 
     84   //当设置 length 属性为一个小于当前数组长度的非负数n时,当前数组中那些索引值大于或等于n的元素将从中删除
     85   //当设置 length 属性为一个大于当前数组长度的非负值n时,不会添加新元素,而是在数字索引元素后面添加空元素
     86    var arr=new Array(1,2,3,4,5,6,7,8);
     87    arr["a"]="a",arr["test"]="hello";
     88    console.log("length:"+arr.length,arr);
     89    //length:8 [ 1, 2, 3, 4, 5, 6, 7, 8, a: 'a', test: 'hello' ]
     90 
     91    arr.length=2;
     92    console.log("length:"+arr.length,arr);
     93    //length:2 [ 1, 2, a: 'a', test: 'hello' ]
     94    //解析:可以看到索引arr[2]到arr[7]都被删除了,因为 length 表示的是数组中数字索引的长度(这个就是数组长度)
     95 
     96    arr.length=5;
     97    console.log("length:"+arr.length,arr);
     98    //length:5 [ 1, 2, <3 empty items>, a: 'a', test: 'hello' ]
     99    //解析:可以看到数组增加了3个空元素,且长度增加了,因为 length 表示的是数组中数字索引的长度(这个就是数组长度)
    100 
    101 
    102    /**
    103     * 数组的方法:
    104     * join()、reverse()、sort()、concat()、slice()、splice()、
    105     * push()、pop()、shift()、unshift()、toString()、toLocalString()、valueOf()
    106     * forEach()、map()、filter()、every()、some()
    107     * reduce()、reduceRight()、indexOf()、lastIndexOf()
    108     */
    109 
    110     //join()方法,按指定字符串将数组中各个元素(这里指有索引的元素,下同)连接起来并返回
    111     //始末状态:不会改变数组本身
    112     //参数:分隔符
    113     var data=[1,2,3,4,5,6,7,8];
    114     data["test"]="test";
    115     console.log(data.join(" @--> "));//1 @--> 2 @--> 3 @--> 4 @--> 5 @--> 6 @--> 7 @--> 8
    116     console.log(data);//[ 1, 2, 3, 4, 5, 6, 7, 8, test: 'test' ] 不会改变数据本身
    117 
    118     //reverse()方法,将数组中的元素倒序,并返回倒序后的数组(是倒序,不是从大到小排序,只是把元素位置倒转)
    119     //始末状态:会改变数组本身
    120     //参数:无
    121     var data=[3,"d",1,"hello",{},-1,9,"b"];
    122     data["test"]="test";
    123     console.log(data.reverse());//[ 'b', 9, -1, {}, 'hello', 1, 'd', 3, test: 'test' ]
    124     console.log(data);//[ 'b', 9, -1, {}, 'hello', 1, 'd', 3, test: 'test' ] 会改变数据本身
    125 
    126     //sort()方法,将数组元素按指定顺序排序并返回排序后的数组,数组元素默认按照字母表顺序排序
    127     //始末状态:会改变数组本身
    128     //参数:可传入一个比较函数作为参数
    129     var data=["z","x","p",5,4,3,2,1,12,19,25,21," ",""];
    130     data["test"]="test";
    131     console.log(data.sort());
    132     //[ '', ' ', 1, 12, 19, 2, 21, 25, 3, 4, 5, 'p', 'x', 'z', test: 'test' ]
    133     //解析:虽然"2"的值比"12","19"要小,但是按照字符串比较时,"12","19",位于"2"前面,可以看出,数组元素默认按照字母表顺序排序
    134 
    135     //比较函数,接受两个参数:
    136     //如果第一个参数应该位于第二个之前则返回一个负数
    137     //如果两个参数相等则返回0
    138     //如果第一个参数应该位于第二个之后则返回一个正数
    139     //原理:类似于冒泡排序
    140 
    141     function compare(a,b){return a-b}//从小到大排序
    142     var data=[5,4,3,2,1,12,19,25,21];
    143     data.sort(compare);
    144     console.log(data);//[ 1, 2, 3, 4, 5, 12, 19, 21, 25 ]
    145 
    146     //原理:如果把上面的比较函数稍加修改,并记录下比较次数和比较的元素,
    147     //输出结果可以看到,一共调用了15次,每次将元素两两比较,仔细查看结果类似于冒泡排序
    148     var count=0,result="";
    149     function compare(a, b) {
    150         //other code
    151         result+="#"+(++count)+"->"+a+"和"+b+"比较 ";
    152         if (a < b) {
    153             return -1;
    154         }
    155         else if (a > b) {
    156             return 1;
    157         }
    158         else {
    159             return 0;
    160         }        
    161         //other code
    162     }
    163     console.log(result);
    164     //#1->5和4比较 #2->5和3比较 #3->4和3比较 #4->5和2比较 #5->4和2比较 #6->3和2比较 #7->5和1比较 #8->4和1比较 
    165     //#9->3和1比较 #10->2和1比较 #11->5和12比较 #12->12和19比较 #13->19和25比较 #14->25和21比较 #15->19和21比较
    166 
    167     // concat()方法,创建并返回一个新数组,新数组元素包括调用concat()方法的原始数组的元素和concat()中的每个参数
    168     // 如果concat()参数中的任意一个参数是数组,则返回的是该数组中的元素,而不是该数组本身
    169     // 始末状态:不会改变数组本身
    170     // 参数:任意类型
    171     var data=[1,2,3];
    172     console.log(data.concat(0,[11,22],[ 33, [44] , [ {} , [55] , "test"], 66] ));
    173     //[ 1, 2, 3, 0, 11, 22, 33, [ 44 ], [ {}, [ 55 ], 'test' ], 66 ]
    174     //解析:(1,2,3)为数组原来的元素,所以直接返回,concat()中有3个参数,其中两个是数组,简化后相当于data.concat(0,[数组一],[数组二])
    175     //因此返回的是0,和[数组一]、[数组二]里面的元素(数组里面元素可以是任意类型,因此元素也可以是数组)
    176     console.log(data);//[ 1, 2, 3 ]
    177 
    178     //slice()方法,返回指定数组的一个片段或者子数组
    179     //始末状态: 不会改变数组本身
    180     //参数:可不带参数或一个参数或两个参数,只有一个参数时,返回指定位置开始到当前数组末尾的所有项,负数表示倒数第几个数
    181     //参数一:截取字符串的起始位置 参数二:截取字符串的结束位置(截取时不包括该位置的字符) 不带参数:与 Array.prototype.slice(0)返回的结果一样
    182     var data=[1,2,3,4,5,6,7,8];
    183     data["test"]="test";
    184     console.log(data.slice(3));//[ 4, 5, 6, 7, 8 ] 从下标位3的位置开始一直到数组末尾
    185     console.log(data.slice(2,-1));//[ 3, 4, 5, 6 ] 从下标位2的位置开始一直到数组倒数第二个数(截取时不包括该位置的字符)
    186     console.log(data);//[ 1, 2, 3, 4, 5, 6, 7, 8, test: 'test' ]
    187 
    188     //splice()方法,在数组中插入或删除元素,返回在数组中删除的元素
    189     //始末状态:会改变数组本身
    190     //参数:可有一个或两个参数或多个,只有一个参数时,从起始位置到数组末尾的所有元素都将被删除(这里指有索引的元素,前面已经提过了)
    191     //参数一:插入或删除的起始位置 参数二:从数组中删除的元素个数 参数二后面的参数:这些参数将会插入数组参数一中的位置
    192     var data=[1,2,3,4,5,6,7,8];
    193     data["test"]="test";
    194     console.log(data.splice(6));//[ 7, 8 ]
    195     console.log(data);//[ 1, 2, 3, 4, 5, 6, test: 'test' ]
    196     console.log(data.splice(3,2));//[ 4, 5 ]
    197     console.log(data);//[ 1, 2, 3, 6, test: 'test' ]
    198     console.log(data.splice(2,0,11,[22],{}),data);
    199     //输出:[] ,从下标为2的位置开始删除0个元素(即不删除),在将后面的参数插入数组,插入位置是下标2的位置(即参数一)
    200     console.log(data);//[ 1, 2, 11, [ 22 ], {}, 3, 6, test: 'test' ]
    201 
    202     //push()方法,在数组末尾添加参数,并返回修改后数组的长度(即length的值)
    203     //始末状态:会改变数组本身
    204     //参数:任意个任意类型的参数
    205     var data=[1,2,3];
    206     data["test"]="test";
    207     console.log(data.push(4,[5],{}));//6
    208     console.log(data);//[ 1, 2, 3, 4, [ 5 ], {}, test: 'test' ]
    209 
    210     //pop()方法,删除并返回数组最后一个元素
    211     //始末状态:会改变数组本身
    212     //参数:无
    213     var data=[1,2,3];
    214     data["test"]="test";
    215     console.log(data.pop());//3 删除被返回元素 3
    216     console.log(data);//[ 1, 2, test: 'test' ]
    217 
    218     //unshift()方法,与push()类似,只不过添加的参数是在数组开头
    219     //shift()方法,与pop()类似,只不过删除的参数是在数组开头
    220 
    221     //forEach()方法,对数组中的每一项运行给定函数,无返回值
    222     //始末状态:不会改变数组本身
    223     //参数:给定的函数
    224     //函数参数:可以有3个参数,参数一:当前数组元素 参数二:当前元素索引 参数三:数组本身
    225     var data=[1,2,3,{}];
    226     var count=0;
    227     data["test"]="test";
    228     console.log(data.forEach(function(item,index,arr){count++;}));//undefined 无返回值
    229     console.log(data,"count:"+count);//[ 1, 2, 3, {}, test: 'test' ] 'count:4' 可以看出循环了4次
    230 
    231     //map()方法,将数组每个元素传递给指定函数,返回一个数组,该数组包含指定函数的返回值
    232     //始末状态:不会改变数组本身
    233     //参数:给定的函数
    234     //函数参数:可以有3个参数,参数一:当前数组元素 参数二:当前元素索引 参数三:数组本身
    235     var data=[1,2,3,4,5];
    236     data["test"]="test";
    237     console.log(data.map(function(item,index,arr){return item*2;}));//[ 2, 4, 6, 8, 10 ]
    238     console.log(data);//[ 1, 2, 3, 4, 5, test: 'test' ]
    239 
    240     //filter()方法,对数组中的每一项运行给定函数,返回指定函数运行结果为true 的项组成的数组
    241     //始末状态:不会改变数组本身
    242     //参数:给定的函数
    243     //函数参数:可以有3个参数,参数一:当前数组元素 参数二:当前元素索引 参数三:数组本身
    244     var data=[1,2,3,4,5];
    245     data["test"]="test";
    246     console.log(data.filter(function(item,index,arr){return item%2==0;}));//[ 2, 4 ] 过滤出偶数
    247     console.log(data);//[ 1, 2, 3, 4, 5, test: 'test' ]
    248 
    249     //every()方法,对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true
    250     //始末状态:不会改变数组本身
    251     //参数:给定的函数
    252     //函数参数:可以有3个参数,参数一:当前数组元素 参数二:当前元素索引 参数三:数组本身
    253     var data=[1,2,3,4,5];
    254     data["test"]="test";
    255     console.log(data.every(function(item,index,arr){return item%2==0;}));//false 部分返回 true
    256     console.log(data.every(function(item,index,arr){return item>0;}));//true 全部都返回 true
    257     console.log(data);//[ 1, 2, 3, 4, 5, test: 'test' ]
    258 
    259     //some()方法,对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true
    260     //始末状态:不会改变数组本身
    261     //参数:给定的函数
    262     //函数参数:可以有3个参数,参数一:当前数组元素 参数二:当前元素索引 参数三:数组本身
    263     var data=[1,2,3,4,5];
    264     data["test"]="test";
    265     console.log(data.some(function(item,index,arr){return item%2==0;}));//true 部分返回 true
    266     console.log(data.some(function(item,index,arr){return item>0;}));//true 全部都返回 true
    267     console.log(data);//[ 1, 2, 3, 4, 5, test: 'test' ]
    268 
    269     //reduce()方法,按照指定函数,迭代数组的每一项,然后返回一个构建的最终值
    270     //始末状态:不会改变数组本身
    271     //参数:参数一:执行简化操作的函数 参数二(可选):传递给函数的初始值,当没有改参数时会将数组的第一个元素作为初始值
    272     //函数参数:可以有4个参数,参数一:当前为止累计操作的结果 参数二:当前数组元素 参数三:当前元素索引 参数四:数组本身
    273     var data=[1,2,3,4,5];
    274     data["test"]="test";
    275     console.log(data.reduce(function(x,y){return x+y},10));//25 (即10+1+2+3+4+5的累加结果)
    276     console.log(data.reduce(function(accumulative,item,index,arr){
    277         console.log("accumulative:"+accumulative); 
    278         return accumulative+item
    279     }));//accumulative:1(数组第一个元素作为初始值) accumulative:3(1+2) accumulative:6(3+3) accumulative:10(6+4) ,15 (即1+2+3+4+5的累加结果)
    280     console.log(data);//[ 1, 2, 3, 4, 5, test: 'test' ]
    281 
    282     //reduceRight()方法,与reduce(),不过是按照索引从高到低运算
    283     var data=[1,2,3,4,5];
    284     data["test"]="test";
    285     console.log(data.reduceRight(function(x,y){return x+y},10));//25 (即10+1+2+3+4+5的累加结果)
    286     console.log(data.reduceRight(function(accumulative,item,index,arr){
    287         console.log("accumulative:"+accumulative); 
    288         return accumulative+item
    289     }));//accumulative:5(数组最后一个元素作为初始值) accumulative:9(5+4) accumulative:12(9+3) accumulative:14(12+2) ,15 (即5+4+3+2+1的累加结果)
    290     console.log(data);//[ 1, 2, 3, 4, 5, test: 'test' ]
    291 
    292     
    293     //indexOf()方法,搜索整个数组中具有给定值得元素,返回找到的第一个元素的索引,没有找到则返回-1
    294     //始末状态:不会改变数组本身
    295     //参数:参数一:要搜索的元素(这里指有索引的元素,前面已经提过了) 参数二(可选):指定从哪个元素开始搜索,默认为0,负数表示从倒数第几个数开始
    296     var data=[1,1,2,3,4,5,{},"str","str",6,7];
    297     data["test"]="test";
    298     console.log(data.indexOf(1),data.indexOf("str",-4),data.indexOf("test"));//0 7 -1
    299     //解析:对于元素“1”,找到遇到的第一个“1”,返回该元素下标"0"。对于元素"str",从倒数第4个数(即从左往右的第一个“str”)开始搜索,
    300     //找到遇到的第一个"str",返回该元素下标“7”。对于"test",由于这里是指有索引的元素,因此没有找到对应的元素,返回"-1"
    301 
    302     //lastIndexOf()方法,与indexOf()方法类似,只不过搜索的方向是从数组尾部开始搜索
    303     var data=[1,1,2,3,4,5,{},"str","str",6,7];
    304     data["test"]="test";
    305     console.log(data.lastIndexOf(1),data.lastIndexOf("str",-4),data.lastIndexOf("test"));//1 7 -1
    306     //解析:对于元素“1”,因为是从尾部开始搜索,所以先遇到的是数组中的第二个"1",返回该元素下标"1"。
    307     //对于"str"和“test"解析同上
  • 相关阅读:
    谈谈vertical-align的text-bottom和text-top
    【golang】代码学习
    【golang】json相关:unmarshal
    【tidb】相关的调研
    【php】sort函数整理
    【hive学习笔记1】-开始
    python2和python3区别
    python: 类型转换(int,long,float->string)
    【java】查找应用程序的资源
    【java】已经学习的部分
  • 原文地址:https://www.cnblogs.com/go4it/p/9865970.html
Copyright © 2011-2022 走看看