1. 程式人生 > >【ES6】陣列的擴充套件(二)之Array.from()和Array.of()

【ES6】陣列的擴充套件(二)之Array.from()和Array.of()

Array.from()

Array.from方法用於將兩類物件轉為真正的陣列:類似陣列的物件和可遍歷(iterator)的物件(包括Map和Set)

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

// ES5的寫法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']

// ES6的寫法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

擴充套件運算子背後呼叫的是遍歷器介面(Symbol.iterator),如果一個物件沒有部署這個介面,就無法轉換。Array.from方法還支援類似陣列的物件。所謂類似陣列的物件,本質特徵只有一點,即必須有length屬性。因此,任何有length屬性的物件,都可以通過Array.from方法轉為陣列,而此時擴充套件運算子就無法轉換。

Array.from({length:3})   // [undefined,undefined,undefined]

對於還沒有部署該方法的瀏覽器,可以用Array.prototype.slice方法替代。

const toArray = (() => 
    Array.from ? Array.from : obj => [].slice.call(obj)
)();

Array.from還可以接受第二個引數,作用類似於map方法,用來對每個元素進行處理,將處理後的值放入返回的陣列。

Array.from([1,2,3],x => x*x)   // [1, 4, 9]
Array.from([1,2,3].map(x => x*x))   // [1, 4, 9]

下面的例子將陣列中布林值為false的成員轉為0。

Array.from([1,,2,,3],(n) => n || 0)
// [1, 0, 2, 0, 3]

Array.from可以將各種值轉為真正的陣列,並且還提供map功能。

Array.from({length:2},() => 'jack')
// ["jack", "jack"]

Array.of()

Array.of方法用於將一組值,轉換為陣列。

Array.of(3,2,1)   // [3, 2, 1]
Array.of(3).length   // 1

這個方法的主要目的,是彌補陣列建構函式Array()的不足。

Array()   // []
Array(3)   // [, , ,]
Array(3,2,1)   // [3, 2, 1]
上面程式碼中,Array方法沒有引數,一個引數、三個引數時,返回結果都不一樣。只有當引數個數不少於2個時,Array()才會返回由引數組成的新陣列。引數個數只有一個時,實際上是指定陣列的長度。

Array.of總是返回引數值組成的陣列。如果沒有引數,就返回一個空陣列。

Array.of方法可以用下面的程式碼模擬實現。

function ArrayOf(){
    return [].slice.call(arguments)
}