创建数组
数组内置方法
衍生问题:
1. 如何检测某个对象是不是数组?
创建数组的基本方式
1. 使用 Array 构造函数
- var colors = new Array();
- var colors = new Array(20);// 知道数组的长度
- var colors = new Array("red","blue","green");// 直接传递数组的项
注意:
给构造函数传递一个值也可以创建数组, 但是这个时候就要看传递值的类型.
- 若传递的是数值
var clolors = new Array(3); //[empty × 3] 则创建了一个包含三项的数组
- 若传递的是其他类型的参数, 比如字符串
var colors = new Array('3');//["3"]
- 在使用 Array 构造函数时, 也可以省略 new 操作符
2. 使用数组字面量表示法.(不要被数组字面量这个概念吓着, 其实就是由一对包含数组项的方括号表示, 多个数组项之间逗号隔开)
- - var colors = ["red","blue","green"]; //["red","blue","green"]
- - var colors = [];// 创建一个空数组
- 但是要注意,
var v = [1,2,]; // 会创建一个包含 2 或者 3 项 (IE) 的数组
- 数组最多可以包含 4294967295 = 2 的 32 次方 - 1 个项.
数组内置方法
转换方法
所有的对象都具有下面三个方法.
- toString()
- valueOf()
- toLocaleString()
- 在控制台运行如下代码:
- var c = ['red', 'blue', 'green'];
- c.toString();//"red,blue,green"
- c.valueOf();//["red", "blue", "green"]
- c.toLocaleString();//"red,blue,green"
可以看到:
toLocaleString() 和 toString()会返回由数组中每一项以英文逗号拼接的字符串;
valueOf() 返回的还是数组;
分隔方法
join()
通过这个方法, 可以使用不同的分隔符来拼接数组.
- 在控制台执行
c.join('||') //"red||blue||green"
若是不传分隔符, 默认就是英文逗号拼接
c.join() //"red,blue,green"
栈方法
push()
pop()
ECMAScript 专门提供这两种方法, 实现类似栈的行为(后进先出, 且始终只作用于栈的顶部)
- push(): 可以接收任意数量的参数, 把它们逐个添加到数组的尾部, 并返回修改后数组的长度.
- pop(): 从数组末尾移出最后一项, 减少数组的 length 值, 然后返回移出的项.
队列方法
- shift()
- unshift()
队列与栈有所不同. 队列是先进先出, 且在列表的末端添加项, 从列表的前端移出项. 结合使用 push()和 shift()方法, 即可模拟队列; 结合使用 pop()和 unshift()方法, 即可反向模拟队列; 即在数组的前端添加项, 从数组的末端移出项.
- shift() 在控制台执行下面代码:
- var colors = new Array();
- var count = colors.push("red", "green");
输出 colors 和 count:
- colors // ["red", "green"]
- count // 2
- count = colors.push("black");
- colors // ["red", "green","black"]
- count // 3
- var item = colors.shift();
- item//"red"
- colors// ["green", "black"]
可以看出, shift()是移出数组中的第一项并返回该项, 同时将数组长度减 1.
- unshift()
与 shift()方法相反, 该方法可以在数组前端添加任意个项并返回新数组长度. 在控制台输入如下代码:
- var colors = new Array();
- var count = colors.unshift("red", "green"); //2
- colors //"red", "green"]
- count = colors.unshift("black"); //3
- colors //["black", "red", "green"]
重排序方法
reverse() 反转数组
sort() 按升序排列数组项
- reverse() 在控制台执行下面代码:
- [1,2,3,4,5].reverse() // [5, 4, 3, 2, 1]
- - sort()
- [3,5,1,9,7].sort() // [1, 3, 5, 7, 9]
但是要注意: sort()方法比较的是字符串, 即便数组中每一项都是数值, sort()方法比较的也是字符串, 如下所示:
[10, 5, 2, 3].sort() //[10, 2, 3, 5]
这是因为, 为了实现排序, sort()方法会调用每个数组项的 toString()方法.
操作方法
concat() 连接数组
先创建当前数组的一个副本, 然后将接收到的参数添加到这个副本的末尾, 最后返 回新构建的数组.
1)若没有给 concat()方法传参数, 则只是复制当前数组并返回副本.
2)如果传递给 concat()方法的是一个或多个数组, 则该方法会将这些数组中的每一项都添加到结果数组中.
3)如果传递的值不是数组, 这些值就被会简单的添加到结果数组的末尾.
- concat() 在控制台执行下面代码:
- var colors = [1, 2,3];
- var colors2=colors.concat("yellow", ["a", "b"]);
- colors2 // [1, 2, 3, "yellow", "a", "b"]
- slice()
基于当前数组中的一个或多个项创建一个新数组. 我的理解就是用于切割数组的, 但是不影响原数组. 要注意的就是参数. 根据参数来分:
1)一个参数, 且参数为正
2)一个参数, 且参数为负
3)两个参数, 且参数都为正
4)两个参数, 且参数都为负
5)两个参数, 一正一负, 不分先后
- 根据上面五种情况举例.
- var colors = [1, 2, 3];
- colors.slice(1) // [2, 3](返回从该参数指定位置开始到当前数组末尾的所有项)
- colors.slice(-1) // [3] (参数加上数组长度, 然后和为正的处理相同)
- colors.slice(1, 3) // [2, 3](返回起始位置和结束位置之间的项, 不包括结束位置)
- colors.slice(-2,-1) // [2](参数加上数组长度, 然后和为正的处理相同)
- colors.slice(-2,1) // [] 无意义
- colors.slice(2,-1) // [] 无意义
splice() 删除, 插入, 替换均可(根据参数的不同, 作用不同)
删除: 两个参数, 第一个参数是要删除的第一项的位置; 第二个参数是要删除的项数.
插入: 至少三个参数, 第一个参数是插入的起始位置; 第二个参数是 0(要删除的项); 第三个参数是要插入的项. 如果要插入多个项, 可以再传入第四个, 第五个等等项.
替换: 至少三个参数, 第一个参数是要替换的起始位置; 第二个参数是要删除的项数(大于 0); 第三个参数要替换的项. 同替换, 如果要替换多个项, 可以再传入第四个, 第五个等等项.(注意: 插入的项数不需要与删除的项数相等)
- 控制台示例如下:
- var colors = [1, 2, 3];
- // 删除
- colors.splice(0,1) // [1]
- colors // [2, 3]
- // 替换
- colors.splice(0,1, 'yellow', 'red') // [2]
- colors // ["yellow", "red", 3]
- // 插入
- colors.splice(0, 0, 'aa', 'bb') // []
- colors // ["aa", "bb", "yellow", "red", 3]
位置方法
indexOf() 从数组的开头向后查找
lastIndexOf() 从数组的末尾开始向前查找
迭代方法
- every()
- filter()
- forEach()
- map()
- some()
缩小方法
- reduce()
- reduceRight()
来源: http://www.jianshu.com/p/af582d8b447e