1, Array.of() 建立數組用, 建立數組的新方法web
這個方法的由來,主要是由於使用new Array() 建立數組的時候,行爲不一致。當咱們給new Array() 傳遞一個數字的時候,他不是建立一個數組包含這個元素,而是建立一個長度爲這個數字的數組。但當傳遞一個其它類型的數據給new Array() 的時候,它只會建立包含這個元素的數組。數組
let arr1 = new Array(3); console.log(arr1[0]) // undefined console.log(arr1.length) // 3 let arr2 = new Array('3'); console.log(arr2[0]) // '3' console.log(arr2.length) // 1
使用Array.of 建立數組就不同了,給它傳遞一個參數,它永遠是建立包含這個參數的數組,數組的length 永遠爲1. 把上面的new Array 改爲Array.of 試一試函數
let arr1 = Array.of(3); console.log(arr1[0]) // 3 console.log(arr1.length) // 1 let arr2 = Array.of('3'); console.log(arr2[0]) // '3' console.log(arr2.length) // 1
不只能夠傳遞一個參數, 你能夠傳遞任意多個的參數,只要用逗號把它們一一隔開就好,這些參數都會成爲數組的元素。this
let arr1 = Array.of(3, 2, 1); console.log(arr1[0], arr1[1], arr1[2]) // 3 2 1 console.log(arr1.length) // 3
總之,你無論傳遞什麼內容給Array.of() 方法,這些內容最終都會成爲數組的元素。spa
2, Array.from(), 接一個類數組對象或可迭代對象,把它們轉化成數組。prototype
一直都在說類數組對象,到如今才知道什麼是類數組對象。就是一個對象的全部屬性除了length這個屬性以外,其他全都是數字,準確的說是數字型字符串。code
let obj = { // 類數組對象 0: 'sam', 1: 'jason', length: 2 }
原來要把這個類數組對象轉化爲真正的數組須要調用Array.prototype.slice.call(obj); 比較麻煩,如今直接調用Array.from(obj) 就能夠了。對象
let obj = { // 類數組對象 0: 'sam', 1: 'jason', length: 2 } let arrFromObj = Array.from(obj) console.log(Array.isArray(arrFromObj)) // true console.log(arrFromObj) // [ 'sam', 'jason' ]
可迭代對象呢,也是ES6 新加的,這個之後再說,只要知道set 和map 都是可迭代對象就能夠了。也就是說,能夠把set 和map 也傳遞給Array.from(), 生成一個新數組。blog
let set = new Set(); set.add(2); set.add(4); let map = new Map(); map.set('name', 'sam'); map.set('job', 'web'); let arrFromSet = Array.from(set) console.log(Array.isArray(arrFromSet)) // true console.log(arrFromSet) // [ '2', '4'] let arrFromMap = Array.from(map); console.log(Array.isArray(arrFromMap)) // true console.log(arrFromMap) // [ [ 'name', 'sam' ], [ 'job', 'web' ] ]
除了第一個參數外,Array.from 還有第二個,第三個參數。第二個參數,一個函數,把可迭代對象或類數組對象轉化爲數組以前,先對對象中的每一項都調用一次函數,函數返回的新值組成轉換後的數組。索引
let set = new Set(); set.add(2); set.add(4); let arrFromSet = Array.from(set, value => value + 10) console.log(Array.isArray(arrFromSet)) // true console.log(arrFromSet) // [ 12, 14]
set 迭代對象轉化爲真正的數組以前,每一項2, 4都先調用一次函數value => value + 10. 而後返回12, 14, 這些返回的新值,組成轉換後的數組[12, 14];
若是第二個參數---函數---- 中,有this, 能夠給Array.from 傳遞第三個參數,指定this的指向
let set = new Set(); set.add(2); set.add(4); let helper = { diff: 1, add(value) { return value + this.diff; } }; let arrFromSet = Array.from(set, helper.add, helper); console.log(arrFromSet) // [3, 5]
3, find(), findIndex()
根據名字也能夠看出來,他們是查找元素用的,用法every, some同樣,都是接受一個函數參數,和一個可選的this, find 是返回查找到知足條件的元素,findIndex 則是返回查找到知足條件的元素的索引。看一個簡單的例子就明白了
let arr = [1, 2, 3, 4, 5]; let elem = arr.find(item => item > 3); let elemIndex = arr.findIndex(item => item > 3); console.log(elem, elemIndex) // 4, 3
函數做爲參數規定了要知足的條件,能夠發現,只要有一個元素知足條件,它就不進行查找,直接返回了。