1. 程式人生 > >ECMAScript6(ES6)標準之陣列Array擴充套件方法

ECMAScript6(ES6)標準之陣列Array擴充套件方法

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] ]