JS的数组

来源:互联网 发布:nginx rewrite last 编辑:程序博客网 时间:2024/06/06 02:31

数组概述

数组是值的有序集合。每个值叫做一个元素,每个元素在数组中有一个位置,以数字表示,称为索引

同一个数组的不同元素可以是不同的类型(任意类型都可以)。

JS数组是动态的。增加元素时,长度(length)会自动增加。

JS数组可能是稀疏的。数组元素的索引不一定是连续的,那些没有元素的位置会形成空位


创建数组

使用数组直接量

var arr1 = [];arr1[0] = 'a';arr1[1] = 'b';var arr2 = ['a', 'b'];arr2[2] = 'c';

使用构造函数Array()

// 没有参数时返回一个空数组var arr = new Array();// 只有一个参数时,参数代表数组长度var arr = new Array(2);// 有多个参数时,各参数代表元素var arr = new Array(1, 2, 3);

推荐使用数组直接量定义数组。

数组的元素可以是任意类型

var arr = [[1, 2, 3], {a: 1}, function () {return true;}];

数组的空位

稀疏数组中那些没有元素的位置就是空位

出现空位的情况一

var arr = [];arr.length = 3;

出现空位的情况二

var arr = [,,,]; // IE8及以下版本不支持这条语法规则,会报错。

出现空位的情况三

var arr = new Array(2);

出现空位的情况四

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

显示设置值为undefined并不是空位

// arr1并没有空位var arr1 = [undefined, undefined]var arr2 = [, , ,]

遍历arr2的元素时,因为是空位,没有任何元素(包括undefined),所以返回undefined,与直接赋值为undefined并不相同。


数组与对象

数组是一种特殊的对象

var arr = [1, 2, 3];type arr; // "object"

数组的索引

使用方括号访问数组元素就像用方括号访问对象的属性一样,JS将指定的数字索引值转换成字符串,然后将其作为属性名来使用。

var arr = [1, 2, 3];arr[3] = 4;arr['3'] = 5; // 会覆盖上面一行console.log(arr[3]) // 5console.log(arr['3']) // 5

可以使用负数或非整数来索引数组,但是,此时所创建的并不再是元素了,而是属性。

a[-1.23] = true; // 创建一个名为"-1.23"的属性a["name"] = "tom"; // 创建一个名为"name"的属性a["1000"] = 0; // 数组的第1001个元素a[1.000] // 和a[1]相等

数组的长度

数组有一个length属性,对于稠密数组(即非稀疏),length的值等于数组元素的个数,对于稀疏数组length的值等于最大数字索引值加1。

var arr = [];arr[1] = 'a';arr['c'] = 'c';arr.d = 'd';arr.length; // 2

添加元素时,数组的length是自动变化的。如果手动改变数组的length的值,会删除数组元素或增加空位。

var arr = [1, 2, 3];arr.length = 2;console.log(arr); //[1, 2]arr.length = 3;console.log(arr); //[1, 2, ,]

字符串与数组

字符串可以被视为只读字符数组,可以使用数组的方括号运算符,用来返回某个位置的字符,但无法改变字符串之中的单个字符。

length属性返回字符串的长度,该属性也是无法改变的。

字符串与数组的关系仅此而已。


数组的方法

isArray()

判断一个值是否为数组。这是一个静态方法。

var arr = ['a', 'b'];console.log(Array.isArray(arr)); // true

valueOf()

没有参数,返回数组本身。

var arr = ['a', 'b'];console.log(arr.valueOf(arr)); // ["a", "b"]

toString()

没有参数,返回以逗号分隔的字符串。

var arr = ['a', 'b'];console.log(arr.toString()); // a,b

push()

在数组的末端添加一个或多个元素,并返回添加后的数组的长度。

var a = [];a.push('a'); // 1a.push('b'); // 2a.push(true, {}); // 4a; // ['a', 'b', true, {}]

pop()

没有参数。

用于删除数组的最后一个元素,并返回该元素。

shift()

没有参数。用于删除数组的第一个元素,并返回该元素。

unshift()

用于在数组的第一个位置添加元素,并返回添加新元素后的数组长度。

join()

以参数作为分隔符,将所有数组成员组成一个字符串返回。如果不提供参数,默认用逗号分隔。

var arr = [1,2,3,4];arr.join(); // "1,2,3,4"arr.join(''); // '1234'arr.join("|"); // "1|2|3|4"

concat()

将新数组的成员,添加到原数组的尾部,然后返回一个新数组,常用于连接多个数组,返回一个新数组。

['a'].concat(['b']); // ['a', 'b']['a'].concat(['b'], ['c']); // ['a', 'b', 'c'][1, 2, 3].concat(4, 5, 6); // [1, 2, 3, 4, 5, 6]

reverse()

用于颠倒数组中元素的顺序,返回改变后的数组。

var a = ['a', 'b', 'c'];a.reverse(); // ["c", "b", "a"]a; // ["c", "b", "a"]

slice()

返回指定位置的数组成员组成的新数组,原数组不变。它的第一个参数为起始位置(从0开始),第二个参数为终止位置(但该位置的元素本身不包括在内)。

如果省略第二个参数,则一直返回到原数组的最后一个成员。

splice()

用于删除元素,并可以在被删除的位置添加入新的数组元素。它的返回值是被删除的元素。该方法会改变数组。

var arr = ['a', 'b', 'c', 'd'];arr.splice(2, 2); // ["a", "b"]var arr = ['a', 'b', 'c', 'd'];arr.splice(2, 2, 'hello', 'world', '你好'); // ["a", "b", "hello", "world", "你好"]

如果只有一个参数,则默认后面的都删除。

sort()

默认是按照字典顺序排序。排序后,数组将被改变。

可以传入一个函数作为参数,表示按照自定义方法进行排序。


ES5新加入的方法

map()

对数组的所有成员依次调用一个函数,根据函数结果返回一个新数组。原数组没有变化。

参数
map方法的回调函数依次接受三个参数,分别是当前的数组成员、当前成员的位置和数组本身。
map方法还可以接受第二个参数,表示回调函数执行时this所指向的对象。

var arr = [1, 2, 3];arr.map(function (ele) {    return ele + 1;});

forEach()

遍历数组的所有成员,执行某种操作,但是forEach方法没有返回值。如果需要有返回值,一般使用map方法,如果只是单纯操作数据,一般使用forEach方法。

参数同上

filter()

依次对所有数组成员调用一个测试函数,返回结果为true的成员组成一个新数组返回。

参数同上

[1, 2, 3, 4, 5].filter(function (elem){  return (elem > 3);}); // [4,5]

some()

对所有元素调用一个测试函数,只要有一个元素通过该测试,就返回true,否则返回false。

参数同上

[1, 2, 3, 4, 5].some(function(elem, index, arr){    return elem >= 3;}); // 返回true

every()

对所有元素调用一个测试函数,只有所有元素通过该测试,才返回true,否则返回false。

参数同上

reduce()

依次处理数组的每个元素,最终累计为一个值。

参数
第一个参数是一个处理函数。该函数接受四个参数,分别是:
(1) 用来累计的变量(即当前状态),默认值为0
(2) 数组的当前元素
(3) 当前元素在数组中的序号(从0开始)
(4) 原数组

第二个参数对累计变量指定初值。

[1, 2, 3, 4, 5].reduce(function(x, y){    return x+y;}); // 15[1, 2, 3, 4, 5].reduce(function(x, y){  return x+y;}, 10); // 25

reduceRight()

reduce对数组元素的处理顺序是从左到右(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员),其他地方完全一样。

indexOf()

indexOf方法返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1。

indexOf方法还可以接受第二个参数,表示搜索的开始位置。

var arr = ['a', , undefined];console.log(arr.indexOf(undefined)); // 2

lastIndexOf()

返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1。


1 0