ECMAScript6(ES6)标准之数组Array扩展方法

tip:有问题或者需要大厂内推的+我脉脉哦:丛培森 ٩( ‘ω’ )و

ES6对于数组又扩展了很多方法
包括静态方法和原型链上添加的方法
让我们可以更方便的操作数组
#静态方法
##Array.from()
这个方法可以将
类数组对象(有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]

##Array.of()
这个方法很简单
用于将一组值转换为数组
它弥补了使用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]

填什么就构造什么样的数组
不填就返回什么空数组
#数组操作
##内部拷贝copyWithin()
这是一个原型方法
作用是把这个数组的一部分元素复制到其他位置
这会覆盖原有的元素
返回当前数组
换句话说,这个方法会修改原数组

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]

第一个参数代表从这个位置开始替换
后两个参数代表要拷贝的起始位置和结束为止
同样不包含结束元素,左闭右开
可以使用负值代表倒数
##查找find()与findIndex()
这两个原型方法都有一个回调函数作为参数
(回调函数的参数依次为元素、索引、数组引用,与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

##填充fill()
这个方法用于填充数组
会修改调用它的数组

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]

##包含includes()
这个方法用于检测数组是否含有某个特定值
返回布尔值

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

#数组迭代
##keys()、values()与entries()
它们用于迭代数组
均返回一个迭代器对象
配合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] ]

[==主页传送门==](http://blog.csdn.net/q1056843325)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值