主要知識點:建立數組、數組上的新方法、類型化數組
![]()
《深刻理解ES6》筆記 目錄segmentfault
ES5中建立數組的方式:數組字面量、new一個數組。數組
const arr1 = [] //數組字面量 const arr2 = new Array() //new構建
ES6建立數組:Array.of()、Array.from()函數
調用 new Array() 構造器時,根據傳入參數的類型與數量的不一樣,實際上會致使一些不一樣的結果:this
let items = new Array(2); console.log(items.length); // 2 console.log(items[0]); // undefined console.log(items[1]); // undefined items = new Array("2"); console.log(items.length); // 1 console.log(items[0]); // "2" items = new Array(1, 2); console.log(items.length); // 2 console.log(items[0]); // 1 console.log(items[1]); // 2 items = new Array(3, "2"); console.log(items.length); // 2 console.log(items[0]); // 3 console.log(items[1]); // "2"
ES6 引入了 Array.of() 方法來解決這個怪異問題:
Array.of() 方法建立一個包含全部傳入參數的數組,而無論參數的數量與類型:spa
let items = Array.of(1, 2); console.log(items.length); // 2 console.log(items[0]); // 1 console.log(items[1]); // 2 items = Array.of(2); console.log(items.length); // 1 console.log(items[0]); // 2 items = Array.of("2"); console.log(items.length); // 1 console.log(items[0]); // "2"
Array.from()是將類數組轉換成數組。
ES5 中,將非數組對象轉換爲真正的數組須要編寫一個函數,相似下面這樣:prototype
function makeArray(arrayLike) { var result = []; for (var i = 0, len = arrayLike.length; i < len; i++) { result.push(arrayLike[i]); } return result; } function doSomething() { var args = makeArray(arguments); // 使用 args }
也能夠調用數組原生的 slice() 方法來減小代碼量,就像這樣:code
function makeArray(arrayLike) { return Array.prototype.slice.call(arrayLike); } function doSomething() { var args = makeArray(arguments); // 使用 args }
Array.from()是將類數組轉換成數組:對象
function doSomething() { var args = Array.from(arguments); // 使用 args }
Array.from(arg1, arg2),咱們能夠給該方法提供2個參數,第二個參數做爲第一個參數的轉換:blog
function translate() { return Array.from(arguments, (value) => value + 1); } let numbers = translate(1, 2, 3); console.log(numbers); // 2,3,4
Array.from還能夠設置第三個參數,指定this。索引
let helper = { diff: 1, add(value) { return value + this.diff; } }; function translate() { return Array.from(arguments, helper.add, helper); } let numbers = translate(1, 2, 3); console.log(numbers); // 2,3,4
let numbers = { *[Symbol.iterator]() { yield 1; yield 2; yield 3; } }; let numbers2 = Array.from(numbers, (value) => value + 1); console.log(numbers2); // 2,3,4
find() 與 findIndex() 方法均接受兩個參數:一個回調函數、一個可選值用於指定回調函數內部的 this 。
回調函數可接收三個參數:數組的某個元素、該元素對應的索引位置、以及該數組自身。
兩者惟一的區別是: find() 方法會返回匹配的值,而 findIndex() 方法則會返回匹配位置的索引。
let numbers = [25, 30, 35, 40, 45]; console.log(numbers.find(n => n > 33)); // 35 console.log(numbers.findIndex(n => n > 33)); // 2
用新元素替換掉數組內的元素,能夠指定替換下標範圍:arr.fill(value, start, end)
let numbers = [1, 2, 3, 4]; numbers.fill(1); console.log(numbers.toString()); // 1,1,1,1 let numbers = [1, 2, 3, 4]; numbers.fill(1, 2); console.log(numbers.toString()); // 1,2,1,1 numbers.fill(0, 1, 3); console.log(numbers.toString()); // 1,0,0,1
選擇數組的某個下標,從該位置開始複製數組元素,默認從0開始複製。也能夠指定要複製的元素範圍:
let numbers = [1, 2, 3, 4]; // 從索引 2 的位置開始粘貼 // 從數組索引 0 的位置開始複製數據 numbers.copyWithin(2, 0); console.log(numbers.toString()); // 1,2,1,2 let numbers = [1, 2, 3, 4]; // 從索引 2 的位置開始粘貼 // 從數組索引 0 的位置開始複製數據 // 在遇到索引 1 時中止複製 numbers.copyWithin(2, 0, 1); console.log(numbers.toString()); // 1,2,1,4