深入理解ES6筆記(十)增強的數組功能

主要知識點:創建數組、數組上的新方法、類型化數組
圖片描述

《深入理解ES6》筆記 目錄

創建數組

ES5中創建數組的方式:數組字面量、new一個數組。

const arr1 = [] //數組字面量
const arr2 = new Array() //new構建

ES6創建數組:Array.of()、Array.from()

Array.of() 方法

調用 new Array() 構造器時,根據傳入參數的類型與數量的不同,實際上會導致一些不同的結果:

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() 方法創建一個包含所有傳入參數的數組,而不管參數的數量與類型:

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() 方法

Array.from()是將類數組轉換成數組。
ES5 中,將非數組對象轉換爲真正的數組需要編寫一個函數,類似下面這樣:

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() 方法來減少代碼量,就像這樣:

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個參數,第二個參數作爲第一個參數的轉換:

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() 方法

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

fill() 方法

用新元素替換掉數組內的元素,可以指定替換下標範圍: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

copyWithin() 方法

選擇數組的某個下標,從該位置開始複製數組元素,默認從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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章