ES6对于数组又扩展了很多方法
包括静态方法和原型链上添加的方法
让我们可以更方便的操作数组
这个方法可以将
类数组对象(有length属性的对象)和可遍历对象(ES6新增的Set与Map数据结构)
转化为真正的数组
在ES6之前,要想让类数组对象变成数组
通常做法是调用slice
let arrLike = {
0: 10,
1: 20,
2: 30,
length: 3
}
let arr = Array.prototype.slice.call(arrLike);
console.log(arr); //[10, 20, 30]
现在我们可以这么做
let arr = Array.from(arrLike);
console.log(arr); //[10, 20, 30]
如果参数是一个数组,那么会返回一个一模一样的新数组(浅拷贝)
而且这个方法会将数组空位转换为undefined
换句话说,会忽略空位
let arr = Array.from([10, , 30]);
console.log(arr); //[10, undefined, 30]
还要注意拷贝的数组是浅拷贝
let arr = [10, ['a', 'b'] , 30];
let newArr = Array.from(arr);
console.log(newArr); //[10, ['a', 'b'], 30]
arr[1].push('c');
console.log(newArr); //[10, ['a', 'b', 'c'], 30]
这个方法还有一个额外的参数
用于对元素进行处理
类似于ES5的数组方法map
let arrLike = {
0: 10,
1: 20,
2: 30,
length: 3
}
let arr = Array.from(arrLike,function(x){
return x*x;
});
console.log(arr); //[100, 400, 900]
这个方法很简单
用于将一组值转换为数组
它弥补了使用new Array()构造数组的奇怪行为
比如说填入一个参数
let arr = new Array(3); //构建了一个稀疏数组
只填写一个参数就会构建一个长度为3的稀疏数组
这不是我们想要的
但Array.of()可以很好的解决这个问题
let arr1 = Array.of(3);
let arr2 = Array.of(1, 2, 3);
let arr3 = Array.of();
let arr4 = Array.of(undefined);
let arr5 = Array.of(null);
console.log(arr1); //[3]
console.log(arr2); //[1, 2, 3]
console.log(arr3); //[]
console.log(arr4); //[undefined]
console.log(arr5); //[null]
填什么就构造什么样的数组
不填就返回什么空数组
这是一个原型方法
作用是把这个数组的一部分元素复制到其他位置
这会覆盖原有的元素
返回当前数组
换句话说,这个方法会修改原数组
let arr = [1, 2, 3, 4, 5, 6, 7, 8];
arr.copyWithin(1, 5, 8);
console.log(arr); //[1, 6, 7, 8, 5, 6, 7, 8]
第一个参数代表从这个位置开始替换
后两个参数代表要拷贝的起始位置和结束为止
同样不包含结束元素,左闭右开
可以使用负值代表倒数
这两个原型方法都有一个回调函数作为参数
(回调函数的参数依次为元素、索引、数组引用,与ES5数组方法相同)
find()会返回第一个满足条件的元素
findIndex()会返回第一个满足条件的索引
没有找到都会返回-1
这里满足条件意思就是函数参数返回值为true
let arr = [10, 20, 30, 40, 50];
console.log(arr.find(function(value, index, arr){
return value > 25;
}));// 30
console.log(arr.findIndex(function(value, index, arr){
return value > 25;
}));// 2
这个方法用于填充数组
会修改调用它的数组
let arr = [1, 2, 3];
console.log(arr.fill(100)); //[100, 100, 100]
这里数组所有的元素都被替换为100
let arr = new Array(3);
console.log(arr.fill(100)); //[100, 100, 100]
此外还可以指定填充的起始位置和终止位置
let arr = [1, 2, 3, 4, 5];
console.log(arr.fill(100, 1, 4)); //[1, 100, 100, 100, 5]
这个方法用于检测数组是否含有某个特定值
返回布尔值
let arr = [1, 'a', true, null, NaN];
console.log(arr.includes(1)); //true
console.log(arr.includes('a')); //true
console.log(arr.includes(true)); //true
console.log(arr.includes(null)); //true
console.log(arr.includes(NaN)); //true
console.log(arr.includes(undefined)); //false
console.log(arr.includes()); //false
这个方法甚至连NaN都可以检测到
但是我们ES5中的indexOf()是不可以的
let arr = [1, 'a', true, null, NaN];
console.log(arr.indexOf(1)); //0
console.log(arr.indexOf('a')); //1
console.log(arr.indexOf(true)); //2
console.log(arr.indexOf(null)); //3
console.log(arr.indexOf(NaN)); //-1
由此可见indexOf()内部是用严格等于判断的
我们可以这样来判断NaN
let demo = NaN;
console.log(demo + '' === 'NaN'); //true
这里注意isNaN()不仅仅是非数返回true
不是数字都会返回true
它们用于迭代数组
均返回一个迭代器对象
配合for-of循环可以迭代数组
var arr = ['A', 'B', 'C'];
for(let index of arr.keys()){ //遍历索引
console.log(index);
}//0 1 2
for(let item of arr.values()){ //遍历元素
console.log(item);
}//'A' 'B' 'C'
for(let x of arr.entries()){ //遍历索引和元素
console.log(x);
}//[0, 'A'] [1, 'B'] [2, 'C']
for(let [index, value] of arr.entries()){ //遍历索引和元素
console.log(index + ': ' + value);
}//0: 'A' 1: 'B' 2: 'C'
(这里values()方法我测试的新版本谷歌浏览器不知道为什么还没有实现)
当然我们也可以手动遍历
var arr = ['A', 'B', 'C'];
var ite = arr.entries();
console.log(ite.next().value); //[0, 'A']
console.log(ite.next().value); //[1, 'B']
console.log(ite.next().value); //[2, 'C']
不过for-of就是用于遍历数组的(用for-in遍历对象)
如果全遍历使用for-of更加方便
类比于ES5的Object.keys/Object.values/Object.entries
let person = {
name: 'payen',
sex: 'male',
age: 19
}
console.log(Object.keys(person));//["name", "sex", "age"]
console.log(Object.values(person));//["payen", "male", 19]
console.log(Object.entries(person));//[ ["name","payen"], ["sex", "male"], ["age", 19] ]
==主页传送门==