最近面試遇到那樣一個問題把'abc' 轉換成[a, b, c],就是字串轉成陣列。
看著簡單,我就是說split,然後面試官問還有嗎。我有思考了一下。迴圈用charAt()取,然後還有Array.from()和擴充套件運算子[...'abc']。 然後就是答不出了。然後面試官問還有其他實現方式嗎。我實在想出來,那道題就過了。面試完,自己思考還有什麼方法,又翻看了 阮一峰老師的ECMAScript 6 入門。對Iterator遍歷器又有了新的認識。
1、split
'abc'.split('');
["a", "b", "c"]
複製程式碼
2、Array.from()
Array.from('abc')
["a", "b", "c"]
複製程式碼
3、...
[...'abc']
["a", "b", "c"]
複製程式碼
4、charAt()
function strToArr(str) {
let result = [];
for (let i = 0; i < str.length; i++) {
result.push(str.charAt(i));
}
return result;
}
console.log(strToArr('abc'))
["a", "b", "c"]
複製程式碼
from和擴充套件運算子都是用了迭代器,當然可以使用for of 來迴圈
注意:for...in迴圈讀取鍵名,for...of迴圈讀取鍵值
5、利用for of
var str = 'abc';
for (let a in str) {
console.log(a); // 0 1 2
}
for (let a of str) {
console.log(a); // a b c
}
複製程式碼
遍歷器(Iterator)就是這樣一種機制。它是一種介面,為各種不同的資料結構提供統一的訪問機制。任何資料結構只要部署 Iterator 介面,就可以完成遍歷操作(即依次處理該資料結構的所有成員)。
Iterator 的作用有三個:一是為各種資料結構,提供一個統一的、簡便的訪問介面;二是使得資料結構的成員能夠按某種次序排列;三是 ES6 創造了一種新的遍歷命令for...of迴圈,Iterator 介面主要供for...of消費。
Iterator 的遍歷過程是這樣的。
(1)建立一個指標物件,指向當前資料結構的起始位置。也就是說,遍歷器物件本質上,就是一個指標物件。
(2)第一次呼叫指標物件的next方法,可以將指標指向資料結構的第一個成員。
(3)第二次呼叫指標物件的next方法,指標就指向資料結構的第二個成員。
(4)不斷呼叫指標物件的next方法,直到它指向資料結構的結束位置。
每一次呼叫next方法,都會返回資料結構的當前成員的資訊。具體來說,就是返回一個包含value和done兩個屬性的物件。其中,value屬性是當前成員的值,done屬性是一個布林值,表示遍歷是否結束。
6、Iterator
let str = 'abc'
let iter = str[Symbol.iterator]();
iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }
複製程式碼
原生具備 Iterator 介面的資料結構如下
- Array
- Map
- Set
- String
- TypedArray
- 函式的 arguments 物件
- NodeList 物件
所以陣列可以用的字串也是可以做。