自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

盤點(diǎn)JavaScript中的Iterable Object(可迭代對象)

開發(fā) 前端
可迭代(Iterable) 對象是數(shù)組的泛化。這個(gè)概念是說任何對象都可以被定制為可在 for..of 循環(huán)中使用的對象。

[[421435]]

大家好,我是進(jìn)階學(xué)習(xí)者。

一、概念

可迭代(Iterable) 對象是數(shù)組的泛化。這個(gè)概念是說任何對象都可以被定制為可在 for..of 循環(huán)中使用的對象。

數(shù)組是可迭代的。但不僅僅是數(shù)組,很多其他內(nèi)建對象也都是可迭代的。

二、通過創(chuàng)建一個(gè)對象,就可以輕松地掌握可迭代的概念。

1.字符串是可迭代的

數(shù)組和字符串是使用最廣泛的內(nèi)建可迭代對象。

對于一個(gè)字符串,for..of 遍歷它的每個(gè)字符:

  1. for (let char of "test") { 
  2.   // 觸發(fā) 4 次,每個(gè)字符一次 
  3.   alert( char ); // t, then e, then s, then t 

對于代理對(surrogate pairs),它也能正常工作!

(譯注:這里的代理對也就指的是 UTF-16 的擴(kuò)展字符)

  1. let str = '𝒳😂'
  2. for (let char of str) { 
  3.     alert( char ); // 𝒳,然后是 😂 

2. 顯式調(diào)用迭代器(如何顯式地使用迭代器?)。

將會采用與 for..of 完全相同的方式遍歷字符串,但使用的是直接調(diào)用。這段代碼創(chuàng)建了一個(gè)字符串迭代器,并“手動”從中獲取值。

  1. let str = "Hello"; // 和 for..of 做相同的事//  
  2.             for (let char of str) 
  3.                 alert(char); 
  4.             let iterator = str[Symbol.iterator](); 
  5.             while (true) { 
  6.                 let result = iterator.next(); 
  7.                 if (result.done) break; 
  8.                 alert(result.value); // 一個(gè)接一個(gè)地輸出字符 
  9.             } 

注:

很少需要這樣做,但是比 for..of 給了更多的控制權(quán)。例如,可以拆分迭代過程:迭代一部分,然后停止,做一些其他處理,然后再恢復(fù)迭代。

3. Array.from

有一個(gè)全局方法 Array.from 可以接受一個(gè)可迭代或類數(shù)組的值,并從中獲取一個(gè)“真正的”數(shù)組。然后就可以對其調(diào)用數(shù)組方法了。

例:

  1. let arrayLike = { 
  2.                 0: "Hello"
  3.                 1: "World"
  4.                 length: 2 
  5.             }; 
  6.             let arr = Array.from(arrayLike); // (*) 
  7.             alert(arr.pop()); // World(pop 方法有效)// World(pop 方法有效) 

運(yùn)行結(jié)果:

在 (*) 行的 Array.from 方法接受對象,檢查它是一個(gè)可迭代對象或類數(shù)組對象,然后創(chuàng)建一個(gè)新數(shù)組,并將該對象的所有元素復(fù)制到這個(gè)新數(shù)組。

現(xiàn)在用 Array.from 將一個(gè)字符串轉(zhuǎn)換為單個(gè)字符的數(shù)組:

  1. let str = '𝒳😂';// 將 str 拆分為字符數(shù)組 
  2. let chars = Array.from(str);alert(chars[0]); // 𝒳 
  3. alert(chars[1]); // 😂 
  4. alert(chars.length); // 2 

運(yùn)行結(jié)果:

注:

與 str.split 方法不同,它依賴于字符串的可迭代特性。

因此,就像 for..of 一樣,可以正確地處理代理對(surrogate pair)。(譯注:代理對也就是 UTF-16 擴(kuò)展字符。)

另外一種表達(dá)方式

技術(shù)上來說,它和下文做了同樣的事:

  1. let str = '𝒳😂'
  2. let chars = []; // Array.from 內(nèi)部執(zhí)行相同的循環(huán) 
  3. for (let char of str) {   
  4.   chars.push(char); 
  5. alert(chars); 

運(yùn)行結(jié)果:

但 Array.from 精簡很多。

甚至可以基于 Array.from 創(chuàng)建代理感知(surrogate-aware)的slice 方法(譯注:也就是能夠處理 UTF-16 擴(kuò)展字符的 slice 方法):

  1. function slice(str, start, end) { 
  2.                 return Array.from(str).slice(start, end).join(''); 
  3.             } 
  4.             let str = '𝒳😂𩷶'
  5.             alert(slice(str, 1, 3)); // 😂𩷶// 原生方法不支持識別代理對(譯注:UTF-16 擴(kuò)展字符) 
  6.             alert(str.slice(1, 3)); // 亂碼(兩個(gè)不同 UTF-16 擴(kuò)展字符碎片拼接的結(jié)果) 

三、總結(jié)

本文基于JavaScript基礎(chǔ)。介紹了Iterable object(可迭代對象),應(yīng)用 for..of 的對象被稱為 可迭代的。通過創(chuàng)建一個(gè)對象,詳細(xì)的講解了字符串是可迭代的。顯式調(diào)用迭代器,以及在實(shí)際中 Array.from的應(yīng)用。

歡迎大家積極嘗試,有時(shí)候看到別人實(shí)現(xiàn)起來很簡單,但是到自己動手實(shí)現(xiàn)的時(shí)候,總會有各種各樣的問題,切勿眼高手低,勤動手,才可以理解的更加深刻。 

代碼很簡單,希望對你學(xué)習(xí)有幫助。

本文轉(zhuǎn)載自微信公眾號「前端進(jìn)階學(xué)習(xí)交流」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系前端進(jìn)階學(xué)習(xí)交流公眾號。

 

責(zé)任編輯:武曉燕 來源: 前端進(jìn)階學(xué)習(xí)交流
相關(guān)推薦

2021-09-14 07:26:25

JavaScript迭代對象

2024-11-14 13:15:22

JavaScript可迭代數(shù)組

2025-03-26 10:56:54

2022-01-15 10:01:15

Javascript 高階函數(shù)前端

2022-10-26 08:25:06

Python編程迭代器

2020-11-24 08:00:22

JavaScript對象迭代器

2022-10-24 13:02:38

2010-10-09 09:56:51

JavaScriptObject對象

2021-11-28 08:03:41

Python迭代器對象

2021-10-09 07:10:31

JavaScript對象Python

2024-03-25 08:57:49

模塊迭代對象迭代器

2021-10-21 18:47:37

JavaScript面向對象

2009-06-09 22:11:44

JavaScriptObject

2021-10-09 07:10:30

JavaScriptBigIn函數(shù)

2021-07-20 10:26:12

JavaScriptasyncawait

2024-08-13 15:23:37

2012-07-25 13:25:11

ibmdw

2020-08-23 11:32:21

JavaScript開發(fā)技術(shù)

2021-08-10 09:57:27

JavaScriptPromise 前端

2023-03-01 00:07:32

JavaScript迭代器生成器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號