一. 定义方法

有两种方式可以定义一个数组,

构造函数法

使用Array构造函数创建数组,在使用Array构造函数时可以省略new操作符。

 var arr = Array();
 var arr = new Array(); // 创建一个空数组

 var arr = Array(20);
 var arr = new Array(10); // 创建一个 length 长为 10 的数组

 var arr = Array('1', '2', '3');
 var arr = new Array('1', '2', '3'); // 创建一个包含该三项的数组

对象字面量表示法

var arr=['1', '2', '3'];

注意:数组最多能够包含4294967295个项

二. 数组检测

这篇文章有很详细的说明。《在JavaScript中,如何判断数组是数组?》

三. 数组方法

1.转换方法

所有对象都具有toString()toLocaleString()valueOf() 方法;要注意它们之间的区别

var a=[1,2];
console.log(a.toString()); 
console.log(a.toLocaleString());//1,2
console.log(a.valueOf()); //[1, 2]
  • valueOf:返回数组本身

  • toString():把数组转换为字符串,并返回结果,每一项以逗号分割

  • toLocalString():结果与toString()返回的结果相同,但是调用的是toLocalString方法。

LocaleString()会根据你机器的本地环境来返回字符串,而toString()保持着统一的值。

var number = 1337;
var date = new Date();
var myArr = [number, date, 'foo'];
var str = myArr.toLocaleString(); 
console.log(str); //1337,2016/8/25 下午3:06:46,foo

var number = 1337;
var date = new Date();
var myArr = [number, date, 'foo'];
var str = myArr.LocaleString()会根据你机器的本地环境来返回字符串; 
console.log(str); //1337,Thu Aug 25 2016 15:07:43 GMT+0800 (中国标准时间),foo

使用join()方法,可以设置分隔符

String.join("|");

备注:需要说明一下alert()方法接收字符串参数,在后台调用toString()方法,但对于LocaleString()会调用LocaleString()方法。

2.栈方法

栈(LIFO,后进先出)

a.push()

接受任意数量的参数,逐个推入数组末尾,并返回修改后数组的长度。

var a=[1,2];
var b=a.push(3,4);
console.log(b); //4 数组[1,2,3,4]

b.pop()

不接受参数,从数组末尾移除最后一项,返回数组最后一项。

var a=[1,2];
var b=a.pop();
console.log(b); //2

3.队列方法

LIFO(先进先出)

a.shift()

移除数组中的第一个项,并返回该项。

var a=[1,2];
var b=a.shift();
console.log(b); //1

b.unshift()

unshift() 接收任意个参数,在数组前添加任意个项并返回新数组的长度。备注:IE7及以下返回undefined。

var a=[1,2];
var b=a.unshift(3,4);
console.log(b); //4, 数组为[3,4,1,2]

4.重排序方法

a. sort()

使用时每个数组项调用自身toString()方法转为字符串,再按字符编码升序(非数值大小)排列数组项,因此会出现一种尴尬的事情:

var a=[1,2,3,10,5];
a.sort(); //[1, 10, 2, 3, 5],字符编码排序,10排在1后面

这时我们可以传入一个比较函数。

function compare(a,b){
  if(a<b){
    return -1;
    }else if(a>b){
      return 1;
    }else{
      return 0;
    }
}
var a=[1,2,3,10,5];
a.sort(compare); //[1, 2, 3, 5, 10]

对于数值类型或通过valueOf()方法返回数值类型的对象数组项,可以使用下面这个函数:

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

b.reverse()

反转数组。

var a=[1,2,3,10,5];
a.reverse(); //[5, 10, 3, 2, 1]

5.操作方法

a.concat()

合并数组,传入数组或者参数,不会影响原来的数组。

var a=[1,2,3,4,5];
var a1=[6,7]
var b=a.concat();
var c=a.concat(a1);
var d=a.concat(a1,8,9);
console.log(a);//[1,2,3,4,5]
console.log(b);//[1,2,3,4,5]
console.log(c);//[1,2,3,4,5,6,7]
console.log(d);//[1,2,3,4,5,6,7,8,9]

b.slice()

基于当前数组中的一或多个项创建新数组,不会影响原来数组。

  • 无参数:返回原数组

  • 一个参数:返回从该参数指定位置开始到数组末尾的所有项

  • 两个参数:返回起始和结束之间的项

var a=[1,2,3,4,5];
var b=a.slice();
var c=a.slice(1);
var d=d.slice(1,4);
console.log(a);//[1,2,3,4,5]
console.log(b);//[1,2,3,4,5]
console.log(c);//[2,3,4,5]
console.log(d);//[2,3,4]

c.splice()

可以删除、插入、替换;返回删除的项组成的数组,对原数组造成影响
删除:指定2个参数,要删除的第一项的位置和要删除的项数

var a=[1,2,3,4,5];
var b=a.splice(3,2); //a变为[1, 2, 3]

插入:提供3个参数,起始位置、0、要插入的项

var a=[1,2,3,4,5];
var b=a.splice(3,0,2); //a变为[1, 2, 3, 2, 4, 5]

替换:指定3个参数,起始位置、要删除的项数、要插入的项数(可多项)

var a=[1,2,3,4,5];
var b=a.splice(3,1,2); //a变为[1, 2, 3, 2, 5]

6.位置查找

indexOf()lastIndexOf(),接收两个参数:要查找的项和(可选的)表示起点位置的索引,都返回要查找的项在数组中的位置。

7.迭代方法

  • every():对数组的每一项运行给定的函数,如果该函数对每一项运行都返回 true,则返回 true,对原函数无影响

  • some():对数组中的每一项运行给定的函数,如果该函数对任一项返回 true,则返回 true,对原函数无影响

  • filter():对数组的每一项运行给定函数,返回该函数会返回true的项组成的数组

  • forEach():对数组中的每一项运行给定函数,无返回值

  • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组

8.缩小方法

reduce()和reduceRight()
传入四个参数:前一个值、当前值、项的索引、数组对象本身。这个函数返回的任何值都会作为第一个参数自动传给下一项,第一次迭代发生在数组的第二项上。

var numbers = [1, 2, 3, 4, 5];
var sum= numbers.reduce(function (pre, cur, index, arr) {
  return pre + cur;
})
alert(sum); // 15

四.参考资料

  1. 《JavaScript高级程序设计》

  2. 《JavaScript权威指南》

  3. 在JavaScript中,如何判断数组是数组?

  4. Object.prototype.toLocaleString()


hopeCoder
560 声望47 粉丝

不忘初心,方得始终