ES6新特性七 陣列的擴充詳解

2022-10-07 09:30:09 字數 4194 閱讀 4835

1. array.from()

1) array.from方法用於將兩類物件轉為真正的陣列:類似陣列的物件(array-like object)和可遍歷(iterable)的對gtyamcaa象(包括es6新增的資料結構set和map,他們都部署了iterator介面,字串也是)。

let arraylike = ;

// es5的寫法

var arr1 = .slice.call(arraylike);

console.log(arr1) // ['a', 'b', 'c']

// es6的寫法

let arr2 = array.from(arraylike);

console.log(arr2) // ['a', 'b', 'c']

array.from('hello')// ['h', 'e', 'l', 'l', 'o']

let namesset = new set(['a', 'b'])

array.from(namesset) // ['a', 'b']

2) 擴充套件運算子(...)背後呼叫的是遍歷器介面(symbol.iterator),如果乙個物件沒有部署這個介面,就無法轉換。array.from方法則是還支援類似陣列的物件。所謂類似陣列的物件,本質特徵只有一點,即必須有length屬性。

array.from();擴充套件運算子就轉換不了

// [ undefined, undefined, undefined ]

3) array.from還可以接受第二個引數,作用類似於陣列的map方法,用來對每個元素進行處理,將處理後的值放入返回的陣列。

var a = array.from([1, 2, 3], x => x * x);

console.log(a)

// 等同於

var a1 = array.from([1, 2, 3]).map(x => x * x);

console.log(a1)

var a2 = array.from([1, 2, 3], (x) => x * x)

console.log(a2)// [1, 4, 9]

//只要有乙個原始的資料結構,你就可以先對它的值進行處理,

// 然後轉成規範的陣列結構,進而就可以使用數量眾多的陣列方法。

var a3 = array.from(, () => 'jack')

console.log(a3)// ['jack', 'jack']

2. array.of()

返回引數值組成的陣列。如果沒有引數,就返回乙個空陣列,彌補陣列建構函式array()的不足。因為引數個數的不同,會導致array()的行為有差異。

console.log(array()) //

console.log(array(3)) // [, , ,]

console.log(array(3, 11, 8)) // [3, 11, 8]

console.log(array.of(3, 11, 8))// [3,11,8]

console.log(array.of(3)) // [3]

console.log(array.of()) //

3. 陣列例項的find() 和 findindex()

① 陣列例項的find方法,用於找出第乙個符合條件的陣列成員。它的引數是乙個**函式,所有陣列成員依次執行該**函式,直到找出第乙個返回值為true的成員,然後返回該成員。如果沒有符合條件的成員,則返回undefined

var a = [1, 4, -5, 10].find((n) => n < 0)

console.log(a)

//find方法的**函式可以接受三個引數,依次為當前的值、當前的位置和原陣列。

[1, 5, 10, 15].find(function(value, index, arr) ) // 10

② 陣列例項的findindex方法的用法與find方法非常類似,返回第乙個符合條件的陣列成員的位置,如果所有成員都不符合條件,則返回-1。

[1, 5, 10, 15].findindex(function(value, index, arr) ) // 2

4. 陣列例項的fill()

fill方法使用給定值,填充乙個陣列。陣列中已有的元素,會被全部抹去。

['a', 'b', 'c'].fill(7) // [7, 7, 7]

new array(3).fill(7) // [7, 7, 7]

fill方法還可以接受第二個程式設計客棧和第三個引數,用於指定填充的起始位置和結束位置(包左不包右)。

['a', 'b', 'c'].fill(7, 1, 2)

// ['a', 7, 'c']

5. 陣列例項的 entries() 、keys() 和values()

es6提供三個新的方法——entries(),keys()和values()——用於遍歷陣列。它們都返回乙個遍歷器物件. for...of 會自動的呼叫遍歷器的next().

for (let index of ['a', 'b'].keys())

// 0

// 1

for (let elem of ['a', 'b'].values())

// 'a'

// 'b'

for (let [index, elem] of ['a', 'b'].entries())

// 0 "a"

// 1 "b"

如果不使用for...of迴圈,可以手動呼叫遍歷器物件的next方法,進行遍歷。

let letter = ['a', 'b', 'c'];

let entries = letter.entries();

console.log(entries.next().value); // [0, 'a']

console.log(entries.next().value); // [1, 'b']

console.log(entries.next().value); // [2, 'c']

6. 陣列例項的includes()

array.prototype.includes方法返回乙個布林值,表示某個陣列是否包含給定的值。該方法的第二個引數表示搜尋的起始位置,預設為0。如果第二個引數為負數,則表示倒數的位置。

程式設計客棧[1, 2, 3].includes(2); // true

[1, 2, 3].includes(4); // false

[1, 2, nan].includes(nan); // true

另外,map和set資料結構有乙個has方法,需要注意與includes區分。

map結構的has方法,是用來查詢鍵名的:

比如map.prototype.has(key)、weakmap.prototype.has(key)、reflect.has(target, propertykey)。

set結構的has方法,是用來查詢值的:

比如set.prototype.has(value)、weakset.prototype.has(value)。

7. 陣列的空位

陣列的空位指,陣列的某乙個位置沒有任何值。空位不是undefined,乙個位置的值等於undefined,依然是有值的。

array(3) // [, , ,]

es6則是明確將空位轉為undefined。

console.log(array.from(['a',,'b']))//[ 'a', undefined, 'b' ]

console.log([...['a',,'b']])// [ "a", undefined, "b" ]

let arr = [, 'a',,];

for (let i of arr) //undefined a undefined

// entries()

[...[,'a'].entries()] // [[0,undefined], [1,"a"]]

// keys()

[...[,'a'].keys()] // [0,1]

// values()

[...[,'a'].values()] // [undefined,"a"]

// find()

[,'a'].find(x => true) // undefined

// findindex()

[,'a'].findindex(x => true) // 0

本文位址: http:/ruanjian/j**a/188289.html

ES6新特性詳解

let 和const都是塊級作用域,並且都不會有變數提公升 const宣告的變數都會被認為是常量,不能被修改,但如果被const修飾的是物件,物件中的屬性值可以被修改 看一道簡單的題目 var funcs for var i 0 i 5 i funcs.foreach function func 輸...

es6新特性 ES6新特性(一)

var 1 var宣告的是函式作用域 區域性 但在if for等定義的變數是全域性的 2 var 具有變數提公升,預解析 3 在同乙個作用域下,var可以宣告多次 4 var 宣告的變數會掛載到window上 let1 let不存在變數提公升,在變數使用之前,必須要先宣告 2 let在同一作用域下,...

ES6的新特性

一 let,const與var的區別 1 let,const 不存在變數提公升。2 let,const 在同乙個作用域下不能重複定義相同的變數名稱。3 let,const 有嚴格的作用域,塊級作用域。var 則是函式作用域。4 const 宣告乙個唯讀的常量,一旦定義,常量的值不能改變。5 cons...