1.Array 对象
- 静态方法
- Array.isArray()
作用: 方法返回一个布尔值,表示参数是否为数组
var arr = [1, 2, 3];
typeof arr // "object"
Array.isArray(arr) // true
- slice()
作用: 用于提取目标数组的一部分,返回一个新数组,原数组不变 arr.slice(start, end); 它的第一个参数为起始位置(从0开始,会包括在返回的新数组之中),第二个参数为终止位置(但该位置的元素本身不包括在内)。如果省略第二个参数,则一直返回到原数组的最后一个成员。
slice()没有参数,实际上等于返回一个原数组的拷贝 得到一个新的数组
应用: 是将类似数组的对象转为真正的数组。
Array.prototype.slice.call({ 0: 'a', 1: 'b', length: 2 })// ['a', 'b']
Array.prototype.slice.call(document.querySelectorAll("div"));
Array.prototype.slice.call(arguments);
- splice()
作用:方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。 arr.splice(start, count, addElement1, addElement2, …);第一个参数是删除的起始位置(从0开始),第二个参数是被删除的元素个数。如果后面还有更多的参数,则表示这些就是要被插入数组的新元素.
//从第四个位置删除2个 并插入1跟2
var a = ['a', 'b', 'c', 'd', 'e', 'f'];
a.splice(4, 2, 1, 2) // ["e", "f"]
a // ["a", "b", "c", "d", 1, 2]
//起始位置如果是负数,就表示从倒数位置开始删除。
var a = ['a', 'b', 'c', 'd', 'e', 'f'];
a.splice(-4, 2) // ["c", "d"]
//只是单纯地插入元素,splice方法的第二个参数可以设为0
//从第一个位置插入一个2
var a = [1, 1, 1];
a.splice(1, 0, 2) // []
a // [1, 2, 1, 1]
//只提供第一个参数,等同于将原数组在指定位置拆分成两个数组
//在第二个位置拆分
var a = [1, 2, 3, 4];
a.splice(2) // [3, 4]
a // [1, 2]
- map()
作用: 方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。
var numbers = [1, 2, 3];
//numbers的所有成员一次执行参数函数 ,不影响原数组
numbers.map(function (n) {
return n + 1;
});
// [2, 3, 4]
numbers
// [1, 2, 3]
//map()方法接受一个函数作为参数。该函数调用时,map()方法向它传入三个参数:当前成员、当前位置和数组本身。
[1, 2, 3].map(function(elem, index, arr) {
return elem * index;
});
// [0, 2, 6]
//map()方法还可以接受第二个参数,用来绑定回调函数内部的this变量
var arr = ['a', 'b', 'c'];
[1, 2].map(function (e) {
return this[e];
}, arr)
//也就是说,这个this就是指代了arr,arr[1],arr[2]得到b跟c
// ['b', 'c']
- forEach()
如果数组遍历的目的是为了得到返回值,那么使用map()方法,否则使用forEach()方法,另外forEach无法中断执行 - filter()
作用: 方法用于过滤数组成员,满足条件的成员组成一个新数组返回
//将大于3的数组成员,作为一个新数组返回
[1, 2, 3, 4, 5].filter(function (elem) {
return (elem > 3);
}) //[4,5]
//方法的参数函数可以接受三个参数:当前成员,当前位置和整个数组。
//法还可以接受第二个参数,用来绑定参数函数内部的this变量。
var obj = { MAX: 3 };
var myFilter = function (item) {
if (item > this.MAX) return true;
};
var arr = [2, 8, 3, 4, 1, 3, 2, 9];
arr.filter(myFilter, obj) // [8, 4, 9]
- some(),every()
它们接受一个函数作为参数,所有数组成员依次执行该函数。该函数接受三个参数:当前成员、当前位置和整个数组,然后返回一个布尔值 - reduce() , reduceRight()
作用:reduce()方法和reduceRight()方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,reduce()是从左到右处理(从第一个成员到最后一个成员),reduceRight()则是从右到左(从最后一个成员到第一个成员),其他完全一样。
[1, 2, 3, 4, 5].reduce(function (a, b) {
console.log(a, b);
return a + b;
})
// 1 2
// 3 3
// 6 4
// 10 5
//最后结果:15
//第一次执行:a是数组的第一个成员1,b是数组的第二个成员2。
//第二次执行:a为上一轮的返回值3,b为第三个成员3。
//第三次执行:a为上一轮的返回值6,b为第四个成员4。
//第四次执行:a为上一轮返回值10,b为第五个成员5。至此
//所有成员遍历完成,整个方法的返回值就是最后一轮的返回值15。
[1, 2, 3, 4, 5].reduce(function (
a, // 累积变量,必须
b, // 当前变量,必须
i, // 当前位置,可选
arr // 原数组,可选
) {
// ... ...
//要对累积变量指定初值
[1, 2, 3, 4, 5].reduce(function (a, b) {
return a + b;
}, 10);
// 10 + 1+2+3+4+5
//25
function subtract(prev, cur) {
return prev - cur;
}
[3, 2, 1].reduce(subtract) // 0
[3, 2, 1].reduceRight(subtract) // -4
//实际上可以用来做一些遍历相关的操作
function findLongest(entries) {
return entries.reduce(function (longest, entry) {
return entry.length > longest.length ? entry : longest;
}, '');
}
findLongest(['aaa', 'bb', 'c']) // "aaa"
- indexOf() , lastIndexOf
作用: 方法返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1.
var a = ['a', 'b', 'c'];
a.indexOf('b') // 1
a.indexOf('y') // -1
//indexOf方法还可以接受第二个参数,表示搜索的开始位置
['a', 'b', 'c'].indexOf('a', 1) // -1
//lastIndexOf方法返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1
var a = [2, 5, 9, 2];
a.lastIndexOf(2) // 3
a.lastIndexOf(7) // -1
- 链式使用
var users = [
{name: 'tom', email: 'tom@example.com'},
{name: 'peter', email: 'peter@example.com'}
];
users.map(function (user) {
return user.email;
}).filter(function (email) {
return /^t/.test(email);
}).forEach(function (email) {
console.log(email);
});
//map先产生一个email的数组,接下来 filter 过滤出以t开头的 Email 地址 ,然后 forEach 遍历输出出来