亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

ECMAScript 6即將帶給我們新的數組操作方法前瞻

2024-05-06 16:13:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了ECMAScript 6即將帶給我們新的數組操作方法前瞻,需要的朋友可以參考下
 

本文介紹ECMAScript 6即將帶給我們新的數組操作方法,以及在怎樣在現有瀏覽器應用這些新的數組特性。

Note: 我將使用交替使用構造器(constructor)和類(class)兩個術語。

類方法
數組(Array)自身所擁有的方法。

Array.from(arrayLike, mapFunc?, thisArg?)

Array.from()的基本功能是,轉換兩種類型的對象成數組。

類數組對象(Array-like objects)

該類對象有長度與索引的屬性。DOM操作符的結果即屬于該類,如document.getElementsByClassName()。

可迭代對象(Iterable objects)

這類對象在取值時,每次只能取一個元素。數組是可迭代的,就如ECMAScript中新的數組結構,映射(Map)和集(Set)。

以下代碼是一個轉換類數組對象到數組的一個示例:

 

復制代碼代碼如下:

let lis = document.querySelectorAll('ul.fancy li');
Array.from(lis).forEach(function (li) {
  console.log(node);
});

 

querySelectorAll()的結果不是一個數組,也不會有forEach()這個方法。這是我們需要在使用這個方法之前,將它轉換成數組的原因。

通過Array.from()使用Mapping
Array.from()同樣也是一個泛型使用map()的替代選擇。

 

復制代碼代碼如下:

let spans = document.querySelectorAll('span.name');
// map(), generically:
let names1 = Array.prototype.map.call(spans, s => s.textContent);
// Array.from():
let names2 = Array.from(spans, s => s.textContent);

 

兩個方法中的第二個參數,都是箭頭函數(arrow function)。
在這個示例中,document.querySelectorAll()的結果又是一個類數組對象,而非數組。這就是我們不能直接調用map()的原因。第一個示例中,為了使用forEach(),我們將類數組對象轉換成了數組。這里我們通過泛型方法和兩個參數版本的Array.from(),而省去了中間步驟。

Holes
Array.from()會忽略數組里缺失的元素 - 洞(holes),它會以未定義的元素(undefined elements)進行對待。

 

復制代碼代碼如下:

> Array.from([0,,2])
[ 0, undefined, 2 ]

 

這就意味著,你可以使用Array.from()來創建或者填充一個數組:

 

復制代碼代碼如下:

> Array.from(new Array(5), () => 'a')
[ 'a', 'a', 'a', 'a', 'a' ]
> Array.from(new Array(5), (x,i) => i)
[ 0, 1, 2, 3, 4 ]

 

如果你想用一個固定的值去填充一個數組,那么Array.prototype.fill()(請看下文)將是一個更好的選擇。第一個即是以上示例的兩種方式。

在數組(Array)子類中的from()
另一個Array.from()的使用場景是,轉換類數組對象或可迭代對象到一個數組(Array)子類的一個實例。如你創建了一個Array的子類MyArray,想將此類對象轉化成MyArray的一個實例,你就可以簡單地使用MyArray.from()。可以這樣使用的原因是,在ECMAScript 6中構造器(constructors)會繼承下去(父類構造器是它子類構造器的原型(prototype))。

 

復制代碼代碼如下:

class MyArray extends Array {
  ...
}
let instanceOfMyArray = MyArray.from(anIterable);

 

你可以將該功能與映射(mapping)結合起來,在一個你控制結果構造器的地方完成映射操作(map operation):

 

復制代碼代碼如下:

// from() – determine the result's constructor via the receiver
// (in this case, MyArray)
let instanceOfMyArray = MyArray.from([1, 2, 3], x => x * x);
// map(): the result is always an instance of Array
let instanceOfArray   = [1, 2, 3].map(x => x * x);
Array.of(...items)

 

如果你想將一組值轉換成一個數組,你應該使用數組源文本(array literal)。特別是只有一個值且還是數字的時候,數組的構造器便罷工了。更多信息請參考。

 

復制代碼代碼如下:

> new Array(3, 11, 8)
[ 3, 11, 8 ]
> new Array(3)
[ , ,  ,]
> new Array(3.1)
RangeError: Invalid array length

 

便如果要將一組值轉換成數字子構造器(sub-constructor)的一個實例,我們應該怎么做呢?這就是Array.of()存在的價值(記住,數組子構造器會繼承所有的數組方法,當然也包括of())。

 

復制代碼代碼如下:

class MyArray extends Array {
  ...
}
console.log(MyArray.of(3, 11, 8) instanceof MyArray); // true
console.log(MyArray.of(3).length === 1); // true

 

把值包裹嵌套在數組里,Array.of()會相當方便,而不會有Array()一樣怪異的處理方式。但也要注意Array.prototype.map(),此處有坑:

 

復制代碼代碼如下:

> ['a', 'b'].map(Array.of)
[ [ 'a', 0, [ 'a', 'b' ] ],
[ 'b', 1, [ 'a', 'b' ] ] ]
> ['a', 'b'].map(x => Array.of(x)) // better
[ [ 'a' ], [ 'b' ] ]
> ['a', 'b'].map(x => [x]) // best (in this case)
[ [ 'a' ], [ 'b' ] ]

 

如你所看,map()會傳遞三個參數到它的回調里面。最后兩個又是經常被忽略的(詳細)。

原型方法(Prototype methods)
數組的實例會有很多新的方法可用。

數組里的迭代(Iterating over arrays)

以下的方法,會幫助完成在數組里的迭代:

 

復制代碼代碼如下:

Array.prototype.entries()
Array.prototype.keys()
Array.prototype.values()

 

以上的每一個方法都會返回一串值,卻不會作為一個數組返回。它們會通過迭代器,一個接一個的顯示。讓我們看一個示例(我將使用Array.from()將迭代器的內容放在數組中):

 

復制代碼代碼如下:

> Array.from([ 'a', 'b' ].keys())
[ 0, 1 ]
> Array.from([ 'a', 'b' ].values())
[ 'a', 'b' ]
> Array.from([ 'a', 'b' ].entries())
[ [ 0, 'a' ],
[ 1, 'b' ] ]

 

你可以結合entries()和ECMAScript 6中的for-of循環,方便地將迭代對象拆解成key-value對:

 

復制代碼代碼如下:

for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);
}

 

Note: 這段代碼已經可以在最新的Firefox瀏覽器里運行了。t Firefox.

查找數組元素

Array.prototype.find(predicate, thisArg?) 會返回滿足回調函數的第一個元素。如果沒有任何一個元素滿足條件,它會返回undefined。比如:

 

復制代碼代碼如下:

> [6, -5, 8].find(x => x < 0)
-5
> [6, 5, 8].find(x => x < 0)
undefined
Array.prototype.findIndex(predicate, thisArg?)

 

會返回滿足回調函數的第一個元素的索引。如果找不任何滿足的元素,則返回-1。比如:

 

復制代碼代碼如下:

> [6, -5, 8].findIndex(x => x < 0)
1
> [6, 5, 8].findIndex(x => x < 0)
-1

 

兩個find*方法都會忽略洞(holes),即不會關注undefined的元素?;卣{的完成函數簽名是:

predicate(element, index, array)
通過findIndex()找NaN

Array.prototype.indexOf()有一個大家所熟知的限制,那就是不能查找NaN。因為它用恒等(===)查找匹配元素:

 

復制代碼代碼如下:

> [NaN].indexOf(NaN)
-1

 

使用findIndex(),你就可以使用Object.is(),這就不會產生這樣的問題:

 

復制代碼代碼如下:

> [NaN].findIndex(y => Object.is(NaN, y))
0

 

你同樣也可以采用更通用的方式,創建一個幫助函數elemIs():

 

復制代碼代碼如下:

> function elemIs(x) { return Object.is.bind(Object, x) }
> [NaN].findIndex(elemIs(NaN))
0
Array.prototype.fill(value, start?, end?)

 

用所給的數值,填充一個數組:

 

復制代碼代碼如下:

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

 

洞(Holes)也不會有任何的特殊對待:

 

復制代碼代碼如下:

> new Array(3).fill(7)
[ 7, 7, 7 ]

 

你也可以限制你填充的起始與結束:

 

復制代碼代碼如下:

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

 

什么時候可以使用新的數組方法?
有一些方法已經可以在瀏覽器里使用了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线高清精品| 日韩av中文字幕在线免费观看| 欧美一区二区三区精品电影| 精品久久久久久久久久久久久| 久久深夜福利免费观看| 麻豆国产va免费精品高清在线| 国产一区二区三区高清在线观看| 欧美日韩精品在线观看| 日韩精品在线免费观看视频| 欧美在线一区二区视频| 久久久久久12| 国产91精品黑色丝袜高跟鞋| 亚洲一二在线观看| 成人午夜在线影院| 精品国产乱码久久久久久虫虫漫画| 欧美精品性视频| 欧美高清一级大片| 国产一区二区三区在线播放免费观看| 国产69精品久久久久9| 精品国产欧美一区二区三区成人| 亚洲国产精品福利| 91精品国产高清久久久久久91| 久久久999国产精品| 中文字幕精品—区二区| 91经典在线视频| 精品美女永久免费视频| 久久精品成人一区二区三区| 欧美疯狂性受xxxxx另类| 91精品国产色综合久久不卡98| 成人免费xxxxx在线观看| 欧美成人剧情片在线观看| 欧美大片网站在线观看| 国产日韩欧美91| 日韩视频永久免费观看| 日韩大片免费观看视频播放| 亚洲一区二区三| 久久久人成影片一区二区三区| 国产视频精品在线| 日本成人黄色片| 国产精品爽爽ⅴa在线观看| 国产精品成人av在线| 一夜七次郎国产精品亚洲| 欧美成人全部免费| 国产啪精品视频网站| 大量国产精品视频| 亚洲欧美日韩天堂一区二区| 日韩精品视频观看| 欧美日韩国产中文精品字幕自在自线| 在线激情影院一区| 精品久久久一区二区| 精品久久久久久中文字幕一区奶水| 国产成人精品日本亚洲| 日日噜噜噜夜夜爽亚洲精品| 精品亚洲精品福利线在观看| 懂色av中文一区二区三区天美| 亚洲视频在线视频| 日韩欧美在线免费观看| 国产亚洲精品久久久| 欧美一区二区三区四区在线| 欧美激情精品久久久久久变态| 亚洲欧美日韩综合| 欧美日韩综合视频网址| 欧美大学生性色视频| 18性欧美xxxⅹ性满足| 欧美激情久久久久| 在线一区二区日韩| 亚洲区一区二区| 亚洲成人av片在线观看| 日本19禁啪啪免费观看www| 欧美日韩国产色视频| 亚洲xxxx18| 97超级碰碰碰| xxxx欧美18另类的高清| 国产精品女视频| 成人免费视频网址| 国产福利精品av综合导导航| 亚洲xxxxx电影| 国产精品av在线播放| 在线视频日本亚洲性| 国产97在线观看| 日韩av在线免播放器| 在线激情影院一区| 国产激情久久久| 精品中文字幕视频| 国产精品亚洲片夜色在线| 91国语精品自产拍在线观看性色| 久久91精品国产| 日韩av中文字幕在线| 欧美日韩中文字幕| 伊是香蕉大人久久| 人妖精品videosex性欧美| 欧美激情综合亚洲一二区| 日韩毛片中文字幕| 欧美国产第一页| 欧美日韩国产999| 欧美电影第一页| 国产精品极品美女粉嫩高清在线| 国产精品自产拍高潮在线观看| 日韩在线视频线视频免费网站| 九九精品视频在线观看| 亚洲综合小说区| 中文字幕欧美视频在线| 91亚洲国产精品| 国产日韩中文字幕| 日韩乱码在线视频| 精品偷拍各种wc美女嘘嘘| 日韩av色在线| 秋霞av国产精品一区| 搡老女人一区二区三区视频tv| 国产精品99久久久久久白浆小说| 亚洲美女在线视频| 亚洲成人黄色在线观看| 粉嫩av一区二区三区免费野| 亚洲精品按摩视频| 色午夜这里只有精品| 亚洲www永久成人夜色| 精品国产一区二区三区久久久狼| 日韩在线国产精品| 成人激情视频网| 欧美激情综合色| 成人h片在线播放免费网站| 欧美性极品少妇精品网站| 国产高清视频一区三区| 欧美丰满少妇xxxxx| 欧美极品少妇xxxxⅹ免费视频| 亚洲电影免费观看| 97国产一区二区精品久久呦| 国产v综合v亚洲欧美久久| 中文字幕日韩在线观看| 久久久人成影片一区二区三区| 亚洲va欧美va国产综合剧情| 欧美精品video| 亚洲成人性视频| 国产亚洲视频在线观看| 国产精品久久久久av免费| 欧美国产日韩二区| 欧美日韩午夜激情| 成人亚洲综合色就1024| 免费99精品国产自在在线| 欧美成人三级视频网站| 亚洲成人三级在线| 亚洲xxxx视频| 欧美日韩免费在线观看| 国产成人一区三区| 久久久这里只有精品视频| 亚洲精品福利在线| 亚洲资源在线看| 国产ts人妖一区二区三区| 国产脚交av在线一区二区| 欧美日韩精品在线播放| 国产精品久久久久久久久影视| 国产色婷婷国产综合在线理论片a| 欧美xxxx14xxxxx性爽| 91精品国产自产在线老师啪| 国产精品久久久久久久久久久久久| 欧美黑人巨大精品一区二区| 久久成人一区二区| 色在人av网站天堂精品| 国模精品视频一区二区三区| 久久成人av网站| 成人激情在线观看| 欧美一区二区三区免费观看| 国产精品wwwwww| 国产一区二区三区免费视频|