JS数组详解

JS数组的元素可以是对象或者其他数组

JS数组是动态的,无需指定长度

JS数组是JS对象的特殊形式

1.

  var a = [ , ,]  有两个元素,都为undefined

  var b = new Array(10)  长度为10的数组。构造函数创建数组,一个参数则为指定长度,多个参数则为指定元素。

2.

  了解稀疏数组是了解JS数组真实本质的一部分

3.

  当数组length被设置为小于当前数组长度的非负整数n时,数组中索引值大于等于n的元素被删除

  当length被设置大于当前长度时,只是在数组尾部创建一个空的区域

  让length属性不能修改:

    var a = [1,2,3];

    Object.definedProperty(a,"length",{"writable:false"});  //让length属性只读

4.数组方法:

  push():在数组末尾添加一个或多个元素,并返回数组的新长度

  unshift():在数组首部插入元素,其他元素依次后移,并返回新长度

  pop():删除数组最后一个元素,数组长度减1,并返回被删除的元素

  shift():从头部删除一个元素,返回被删除的元素,并所有元素依次前移

  splice():插入,删除,替换数组,会修改调用数组,并返回被删除的部分。位置从0开始,参数第一个为开始位置,第二个为个数,其后任意个参数指定了插入的元素,从第一个参数指定的位置插入

    var a = [1,2,3,4,5,6,7,8];

    a.splice(4);//返回[5,6,7,8],此时a为[1,2,3,4]

    a.splice(1,2);//返回[2,3],此时a为[1,4]

    a.splice(1,1);//返回[4],此时a为[1]

  slice():返回一个数组的一个片段或子数组,两个参数决定开始和结束位置,从第一个参数到第二个参数,但不包含第二个参数位置

  join():将数组所有元素都转化为字符串,并拼接在一起,返回最后生成的字符串,默认以“,”为分隔符,可以用参数指定分隔符。是String.split()的逆向操作:将字符串分割成数组

  reverse():将数组中的元素颠倒排序,返回逆序数组,采取替换方式,即对原数组产生影响

  sort():将数组的元素排序并返回修改后的数组,默认按字母表排序,undefined元素被排到最后,若不想按字母表排序,则传递一个比较函数

  concat():创建并返回一个新数组,元素包括原数组和concat()的每个参数

  toString()/toLocaleString():toString()与无参join()一样,用“,”连接为字符串;toLocalString(0是toString()本地化版本,即使用本地化的分隔符

ECMAS5中数组方法:(都不修改原始数组,大多数方法第一个参数接收一个函数)

  forEach():遍历数组,不能再所有元素遍历完前终止,即无break,若想提前终止,则把forEach()放入try块中,并能抛出一个异常

    var a = [1,2,3,4,5];

    //求和:

    var sum = 0;

    a.forEach(function(value){sum += value;});

    //元素自加1:

    a.forEach(function(v,i,a){ a[i] = v + 1;});

  map():返回新数组,不修改调用的数组

    var a = [1,2,3];

    var b = a.map(function(x){return x*x;});

    b为[1,4,9]

  filter():按参数函数过滤数组,函数返回值为true则传递对应元素

    var a = [5,4,3,2,1];

    var b = a.filter(function(x){return x < 3});

    b为[2,1]

  every()/some():every()对应所有,some对应存在

    var a = [1,2,3];

    a.every(function(x){return x < 10});//返回true

    a.some(function(x){return x > 2});//返回true

  reduce()/reduceRight():将数组元素进行组合,生成单个值

    var a = [1,2,3];

    var sum = a.reduce(function(x,y){return x+y},0);//第一个参数为组合操作函数,第二个为传递函数的初始值,传给x,无第二个参数则用数组元素作为初始值

    reduceRight()按照数组索引从高到低处理,原理和reduce()一样

  indexOf()/lastIndexOf():搜索整个数组中具有给定值得元素,返回找到的第一个元素的索引,从0开始,若没有则返回-1。index0f()从头到尾,lastIndexOf()从尾到头,第一个参数为查找对象,第二个参数指定开始位置索引

5.遍历优化:数组长度应该只查询一次

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

    //排除null,undefined和不存在的元素

    if(!a[i]) continue;

    //跳过undefined和不存在的元素

    if(a[i] === undefined) continue;

    //跳过不存在的元素

    if(!(i in a)) continue;

    //或者for/in,不存在的索引不会被遍历到 :

    for(var i in a){}

    //跳过继承

    if(!a.hasOwnProperty(i)) continue;

    //跳过不是非负整数

    if(String(Math.floor(Math.abs(Number(i))))) continue;

  ECMA5新增遍历方法:forEach()

6.

  判断数组类型:Array.isArray([])

7.

  js数组的copy不能简单赋值,可以通过concat()或者slice()克隆

8.

  空数组判断:

    var a  = [];

    a == [] ==> false

  应该通过a.length == 0 来判断

原文地址:https://www.cnblogs.com/zawjdbb/p/6635408.html