【ES6】陣列的擴充套件(二)之Array.from()和Array.of()
阿新 • • 發佈:2019-01-31
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方法沒有引數,一個引數、三個引數時,返回結果都不一樣。只有當引數個數不少於2個時,Array()才會返回由引數組成的新陣列。引數個數只有一個時,實際上是指定陣列的長度。Array() // [] Array(3) // [, , ,] Array(3,2,1) // [3, 2, 1]
Array.of總是返回引數值組成的陣列。如果沒有引數,就返回一個空陣列。
Array.of方法可以用下面的程式碼模擬實現。
function ArrayOf(){
return [].slice.call(arguments)
}