ES6爲Array增長了from函數用來將其餘對象轉換成數組。設計模式
固然,其餘對象也是有要求,也不是全部的,能夠將兩種對象轉換成數組。數組
1.部署了Iterator(迭代器)接口的對象,好比:Set,Map,Array。 2.類數組對象,什麼叫類數組對象,就是一個對象必須有length屬性,沒有length,轉出來的就是空數組。
Array.from能夠接受三個參數函數
咱們看定義:Array.from(arrayLike [, mapFn [, thisArg]])this
arrayLike:被轉換的的對象。 mapFn:map函數。 thisArg:map函數中this指向的對象。
在這裏很好理解,就是要被轉換的對象spa
用來對轉換中的每個元素進行加工,並將加工後的結果做爲結果數組的元素值。設計
console.log(Array.from([1, 2, 3, 4, 5], (n) => n + 1)) // 結果[2,3,4,5,6] map函數的實際的作用是給每一個元素都加了1
該參數是很是有用的,咱們能夠將被處理的數據和處理對象分離,將各類不一樣的處理數據的方法封裝到不一樣的的對象中去,處理方法採用相同的名字。code
在調用Array.from對數據對象進行轉換時,能夠將不一樣的處理對象按實際狀況進行注入,以獲得不一樣的結果,適合解耦。對象
這種作法是模板設計模式的應用,有點相似於依賴注入。blog
const obj = { add: function (n) { return n + 1; } } console.log( Array.from( [1, 2, 3, 4, 5], function (x){ return this.add(x) }, obj)) //結果 [2,3,4,5,6]
const setArr = new Set(); setArr.add(1).add(2).add("www"); console.log(Array.from(setArr)); // 結果 [1, 2, "www"] const setArr1 = new Set([1,1,12,2,3,4,5,5,6,6]); console.log(Array.from(setArr1)); // 或者使用展開表達式 console.log([...setArr1]); // 結果 [1, 12, 2, 3, 4, 5, 6] // 同時不難發現set具備去重的功能
const mapArr = new Map(); mapArr.set('m1', 1); mapArr.set('m2', 2); mapArr.set('m3', 3); console.log(Array.from(mapArr)); // 結果 [['m1', 1],['m2', 2],['m3', 3]] console.log(Array.from(mapArr)[1]); // 結果 ["m2", 2]
一個類數組對象必需要有length屬性,他們的元素屬性名必須是數值或者能夠轉換成數值的字符。索引
//注意看區別 console.log(Array.from({ 0: 'dd', 1: 'gg', 2: 'w3', length:3 })) // 結果 ["dd", "gg", "w3"] console.log(Array.from({ 0: 'dd', 1: 'gg', 4: 'w3', length:3 })) // 結果 ["dd", "gg", undefined] console.log(Array.from({ "0": 'dd', 1: 'gg', "3": 'w3', length:6 })) // 結果 ["dd", "gg", undefined, "w3", undefined, undefined] //總結,生成數組的長度由length屬性肯定,若是相應索引位置上沒有值,則爲undefined
console.log( Array.from({ 0: 3, 1: 12 })) // 結果 []
console.log(Array.from({ "s": 'dd', "ss": 'gg', "n": 'w3', length:3 })) // 結果 [undefined, undefined, undefined]
補充