一、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