ES6 數組增長的方法

  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

  函數做爲參數規定了要知足的條件,能夠發現,只要有一個元素知足條件,它就不進行查找,直接返回了。

相關文章
相關標籤/搜索