国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 13:29:17
字體:
來源:轉載
供稿:網友

本文介紹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() 主站蜘蛛池模板: 洛浦县| 沭阳县| 盐亭县| 扶沟县| 龙里县| 乐业县| 洪江市| 天镇县| 大方县| 清徐县| 杂多县| 五原县| 瑞金市| 建宁县| 苏尼特左旗| 瑞安市| 五莲县| 北宁市| 永仁县| 上杭县| 韶关市| 丰台区| 绥阳县| 高邮市| 宝鸡市| 商南县| 广宗县| 绥棱县| 阜南县| 汝城县| 邳州市| 伊春市| 呼伦贝尔市| 阳江市| 安徽省| 双柏县| 章丘市| 饶阳县| 长葛市| 景谷| 石狮市|