title: JS中的数组
date: 2018-9-26 22:42:25
tags: [JavaScript]
categories: JavaScript
数组是什么
数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。
其实本质上,数组属于一种特殊的对象。typeof运算符会返回数组的类型是object。
数组的length属性
数组的length属性,返回数组的成员数量。只要是数组,就一定有length属性。
数组的构造方法
var x = new Array(3) ; // 3表示数组的长度,每一个元素都为undefined
var y = new Array(3,3); // 得到一个数组[3,3],是仿自Java中的写法,不常用。
var a = [3,3] ; // 得到了一个数组[3,3],常用
in 运算符 && for…in 循环
for in循环不仅可以遍历对象,也可以遍历数组,因为数组是一种特殊对象。
- 使用时需要注意,for...in不仅会遍历数组所有的数字键,还会遍历非数字键。
例如:
var a = [1, 2, 3];
a.foo = true;
for (var key in a) {
console.log(key);
}
// 0
// 1
// 2
// foo
数组的遍历
常用for循环,while循环
或forEach遍历(不支持break 和 continue ,不返回值)。
var a = ['a','b','c','d'];
// for循环
for(var i = 0; i < a.length; i++) {
console.log(a[i]);
}
// while循环
var i = 0;
while (i < a.length) {
console.log(a[i]);
i++;
}
// forEach遍历
a.forEach(function(value,key){
console.log(key+':'+value);
})
// 0:a
// 1:b
// 2:c
// 3:d
什么是伪数组
如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,但实际并不是数组。
- 伪数组的原型链中没有Array.prototype
数组.__proto__ === Array.protype
伪数组对象.__proto__ === Object.prototype
数组的一些API
sort() 排序
该方法是JS封装的一个重排序方法,使用的算法是快速排序。不传参时默认为升序排列。
注:sort()方法返回的是原数组,即使用该方法会改变原来的数组序列。
=>arr.sort(function(a,b){return a-b}) 升序
=>arr.sort(function(a,b){return b-a}) 降序
join() 分隔
该方法返回的是字符串,参数表示用什么分隔数组的每一项,不传参默认逗号分隔,参数为空数组时,数组每一项之间没有间隔。
代码示例:
array = ["a", "b", "c", "d"];
array.join('-');
// "a-b-c-d"
concat() 连接
该方法返回的是新数组,原数组不会被改变。
示例:
a = [1,2,3];
b = [4,5,6];
a.concat(b);
// 新数组 [1, 2, 3, 4, 5, 6]
使用concat()方法还可以用于复制数组
例如:
arr = [1,2,3,4,5];
var newArr = arr.concat([]);
// newArr 的值为 [1, 2, 3, 4, 5]
newArr === arr; // false
// 虽然值相同,但这是两个不同的对象,引用的地址不同
map()
功能与forEach相同,但map()有返回值。同样不会改变原数组的值,返回一个新数组。
示例:
arr = [1, 2, 3, 4, 5];
arr.map(function(value,key){
return value * 2;
})
// [2, 4, 6, 8, 10]
filter() 过滤、筛选
用法与map()一样。
示例:
arr = [1, 2, 3, 4, 5];
arr.filter(function(value,key){
return value < 3
})
// [1, 2]
reduce() 可接收一个函数作为累加器
第一个参数传一个函数作为累加器,第二个参数表示初始值。
示例:
arr = [1, 2, 3, 4, 5];
arr.reduce(function(previous,current){
return previous + current;
}, 0)
// 15
可以用reduce()方法来写map()数组每一项×2:
a = [1, 2, 3, 4, 5];
a.reduce(function(array,n){
array.push(n * 2);
return array;
},[])
// [2, 4, 6, 8, 10]
可以用reduce()方法来写filter()筛选偶数:
a = [1, 2, 3, 4, 5];
a.reduce(function(array,n){
if(n % 2 === 0){
array.push(n);
}
return array;
},[])
// [2, 4]