ECMAScript6 新特征——“数组的扩大”

1 Array.from()

Array.from要领用于将两类对象转为真正的数组:相似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)。

语法以下:

ES5:

var arr = [].slice.call(arrayLike);

ES6:

var arr = Array.from(arrayLike);

var o = {length: 3};
var a = Array.from(o);
console.log(Object.prototype.toString.call(a)); //[object Array]
console.log(a.toString()); //,,
console.log(0 in a); //true
console.log(a[0]); //undefined
a.forEach(function(item, index, array) {
    console.log(item); //undefined x 3
});

又如:

var o = {0: "Oliver", 1: 18, length: 2};
var a = Array.from(o);
console.log(Object.prototype.toString.call(a)); //[object Array]
console.log(a.toString()); //Oliver,18
console.log(0 in a); //true
console.log(a[0]); //Oliver
a.forEach(function(item, index, array) {
    console.log(item);
    //Oliver
    //18
});

假如参数是数组,Array.from会返回一个如出一辙的数组

var a = Array.from([1,2,3]);
console.log(a.join("")); //123

var arr = [].concat([1,2,3]);
console.log(arr.join("")); //123

任何有length属性的对象,都能够经由过程Array.from要领转为数组

Array.from还能够接收第二个参数,作用相似于数组的map要领,用来对每一个元素举行处置惩罚,将处置惩罚后的值放入返回的数组。

var a = Array.from([1,2,3], x => x + 1);
console.log(a.join("")); //2,3,4

var a = Array.from([1,2,3]).map(function(x) {return x + 1;});
console.log(a.join("")); //2,3,4

假如map函数内里用到了this关键字,还能够传入该要领第三个参数,用来绑定this

2 Array.of()

Array.of要领用于将一组值,转换为数组。

var a0 = Array(3);
var a1 = Array.of(3);
var a2 = Array.of(undefined);
console.log(a0, a1, a2); //[] [3] [undefined]

该要领只是用于填补Array()的不足

3 数组实例的copyWithin()

在当前数组内部,将指定位置的成员复制到其他位置(会掩盖原有成员),然后返回当前数组。

var a = [1,2,3,4,5];
var newArr = a.copyWithin(0, 2, 3);
console.log(newArr); //[3, 2, 3, 4, 5]
console.log(a); //本来的a也被修改了

var newArr = Array.prototype.copyWithin.call(a, 0, 2);
console.log(newArr); //[3, 4, 5, 4, 5]

4 数组实例的find()喝findIndex()

find要领,用于找出第一个相符前提的数组成员。

它的参数是一个回调函数,一切数组成员顺次实行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。假如没有相符前提的成员,则返回undefined。

var a = [13,2,0,14,-5];
var result = a.find(function(x, i, a) {
    return x > 0;
});
console.log(result); //13

var result = a.find(x => x > 0);
console.log(result); //13

findIndex要领,返回第一个相符前提的数组成员的位置,假如一切成员都不相符前提,则返回-1。

var a = [13,2,0,14,-5];
var result = a.findIndex(function(x, i, a) {
    return x < 0;
});
console.log(result); //4

var result = a.findIndex(x => x < 0);
console.log(a[result]); //-5

5 数组实例的fill()

fill要领运用给定值,添补一个数组。

要领还能够接收第二个和第三个参数,用于指定添补的肇端位置和完毕位置。

var a = [,,,];
console.log(a); //[]
a.fill();
console.log(a); //[undefined, undefined, undefined]

var a = [1,2,3];
a.fill(0);
console.log(a); //[0,0,0]

a.fill(1, 1, 2);
console.log(a); //[0,1,0]

6 数组实例的entries(),keys(),values()

能够用for…of轮回举行遍历

  • keys()是对键名的遍历

  • values()是对键值的遍历

  • entries()是对键值对的遍历

var a = [1, 2, 3, 4, 5];
console.log(a.keys()); //ArrayIterator{}
for(let index of a.keys()){
    console.log(index);
};
for(let [index, elem] of a.entries()){
    console.log(index, elem);
};
//ArrayIterator {}
//0
//1
//2
//3
//4
//0 1
//1 2
//2 3
//3 4
//4 5

7 ES7:数组实例的includes()

要领返回一个布尔值,示意某个数组是不是包括给定的值,该要领属于ES7

var a = [1,2,3,4,5,NaN];
console.log(a.includes(2), a.includes(NaN)); //ture true
//.includes要领支撑比较NaN
console.log(a.indexOf(2), a.indexOf(NaN)); //1 -1
//.indexOf则有缺点

8 数组的空位

数组的空位指,数组的某一个位置没有任何值

空位不是undefined,一个位置的值即是undefined,依然是有值的。空位是没有任何值

  • forEach(), filter(), every()some()都邑跳过空位。

  • map()会跳过空位,但会保存这个值

  • join()toString()会将空位视为undefined,而undefined和null会被处置惩罚成空字符串。

ES6则是明白将空位转为undefined

  • Array.from要领会将数组的空位,转为undefined

  • 扩大运算符(...)也会将空位转为undefined

  • copyWithin()会连空位一同拷贝

  • fill()会将空位视为一般的数组位置

  • for...of轮回也会遍历空位

  • entries()keys()values()find()findIndex()会将空位处置惩罚成undefined

9 ES7:数组推导

ES7的新功能,许可直接经由过程现有数组天生新数组

var a1 = [1, 2, 3, 4];
var a2 = [for (i of a1) i * 2];

a2 // [2, 4, 6, 8]
    原文作者:JS菌
    原文地址: https://segmentfault.com/a/1190000004851215
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞