ES6之Array.of()、Array.from()與iterator迭代器

一、ES5中創建數組

1、創建方式

// 第一種:對象字面的方式
let arr1 = [2, 4]
arr1 //[2,4]
         
// 第二種:new Array() / Array()的方式
let arr2 = new Array(2, 4); //<=>let arr2 = Array(2,4)
arr2 //[2,4]

2、說明:最好使用[]來創建,原因如下:

1>、先看一個演示結果

Array()     //[]
Array(4)    // [,,,,]
Array(2,4)  //[2,4]

上面代碼中,new Array() /Array()沒有參數、一個參數、三個參數時, 返回結果都不一樣。只有當參數個數不少於 2 個時 ,new Array() /Array()纔會返回由參數組成的新數組。參數個數只有一個時,實際上是指定數組的長度。

即:new Array() /Array()有個缺陷,當裏面有一個值是,它代表的是對象成員的個數。而不是值。

2>、


    

 

 

針對上述new Array() / Array()的缺陷,ES6給出了一個新的解決方案->Array.of();

 

二、ES6中創建數組(將一組數據轉化爲數組)

let arr3 = Array.of(4);
arr3 // [4]
// Array.of總是返回參數值組成的數組。如果沒有參數,就返回一個空數組。

三、Array.from()

可能有小夥伴有些疑惑了,既然已經新增了Array.of()這種方式, 還需要Array.from()幹嘛嗎?他們有什麼區別?簡單點說,

Array.from() 適用於將非數組對象轉換爲數組的場景,它的初衷就是爲了解決將非數組對象轉換爲數組的問題。

具體點來說上邊說的非數組對象包含這兩類:類似數組array-like object的對象->(即僞數組)和可遍歷(iterable)的對象(包括ES6

新增的Set和Map)。

1、僞數組

1>什麼是僞數組所謂的僞數組就是具有length屬性,也有 0、1、2、3 等屬性的對象。下面一個數據結構就是典型的僞

數組。

let arrayLike = {
	'0': 'a',
	'1': 'b',
	'2': 'c',
	length: 3
};

2>將僞數組轉換爲真正的數組

// ES5的寫法
let arr4 = [].slice.call(arrayLike);
arr4 // ["a", "b", "c"]

// ES6的寫法
let arr5 = Array.from(arrayLike);
arr5 // ["a", "b", "c"]

3>、常見場景

實際應用中,常見的僞數組有:

DOM 操作返回的 NodeList 集合;

函數內部的arguments對象;

 

2、可遍歷的對象(部署了Iterator接口)

1>什麼是可遍歷的對象?部署了Iterator接口

2>、可遍歷的對象將轉換爲真正數組

let arr6 = Array.from('hello')
arr6 // ["h", "e", "l", "l", "o"]

let namesSet = new Set(['a', 'b'])
let arr7 = Array.from(namesSet)
arr7 // ["a", "b"]

// 上面代碼中,字符串和 Set 結構都具有 Iterator 接口,
// 因此可以被Array.from轉爲真正的數組。

3>、說明

a、擴展運算符背後調用的是遍歷器接口(Symbol.iterator所以採用擴展符...也可以將可遍歷的對象轉化爲真正的數組。

 // Array.from('hello') <=> [...'hello']

b、由於僞數組中沒有部署Iterator 接口,所以不能採用擴展符來進行真正數組的轉換。

c、如果參數是一個真正的數組,Array.from()會返回一個一模一樣的新數組。

d、Array.from()還可以接受第二個參數, 作用類似於數組的map方法,用來對每個元素進行處理, 將處理後的值放入返回的數

組。

Array.from(arrayLike, x => x * x);
// 等同於
Array.from(arrayLike).map(x => x * x);

Array.from()可以將各種值轉爲真正的數組,並且還提供map功能。

3>、補充

原生具備 Iterator 接口的數據結構如下。
            Array
            Map
            Set
            String
            TypedArray
            函數的 arguments 對象
            NodeList 對象

因爲它們的原型對象都擁有一個 Symbol.iterator 方法。

 

四、如何判斷是否已經部署了iterator接口

1、代碼處理:

let df = [1,2,3]
let dg = df[Symbol.iterator](); //得到遍歷器對象
console.log(dg); 

2、結果展示:

變量df是一個數組,原生就具有遍歷器接口,部署在df的Symbol.iterator屬性上面。

由結果看出,原型對象都擁有一個 Symbol.iterator 方法,說明df數組部署了iterator接口。

下面再看一個沒有部署部署了iterator接口的數據結構,會顯示出什麼呢?

// 再看一個沒有部署iterator接口的結構,僞數組
let weiArr = {
		'0': 'first',
		'1': 'second',
		'2': 'three',
		length: 3
	};
			
let result = weiArr[Symbol.iterator]();
console.log(result);

結果:

結果看出,weiArr僞數組上沒有部署iterator接口。

其他的那些需要部署,那些不需要部署,沒部署的如何部署iterator接口,具體的看阮一峯老師的ES6教程:http://es6.ruanyifeng.com/#docs/iterator

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章