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

首頁(yè) > 開發(fā) > JS > 正文

詳談ES6中的迭代器(Iterator)和生成器(Generator)

2024-05-06 16:38:44
字體:
供稿:網(wǎng)友

前面的話

用循環(huán)語(yǔ)句迭代數(shù)據(jù)時(shí),必須要初始化一個(gè)變量來記錄每一次迭代在數(shù)據(jù)集合中的位置,而在許多編程語(yǔ)言中,已經(jīng)開始通過程序化的方式用迭代器對(duì)象返回迭代過程中集合的每一個(gè)元素

迭代器的使用可以極大地簡(jiǎn)化數(shù)據(jù)操作,于是ES6也向JS中添加了這個(gè)迭代器特性。新的數(shù)組方法和新的集合類型(如Set集合與Map集合)都依賴迭代器的實(shí)現(xiàn),這個(gè)新特性對(duì)于高效的數(shù)據(jù)處理而言是不可或缺的,在語(yǔ)言的其他特性中也都有迭代器的身影:新的for-of循環(huán)、展開運(yùn)算符(...),甚至連異步編程都可以使用迭代器

本文將詳細(xì)介紹ES6中的迭代器(Iterator)和生成器(Generator)

引入

下面是一段標(biāo)準(zhǔn)的for循環(huán)代碼,通過變量i來跟蹤colors數(shù)組的索引,循環(huán)每次執(zhí)行時(shí),如果i小于數(shù)組長(zhǎng)度len則加1,并執(zhí)行下一次循環(huán)

var colors = ["red", "green", "blue"];for (var i = 0, len = colors.length; i < len; i++) { console.log(colors[i]);}

雖然循環(huán)語(yǔ)句語(yǔ)法簡(jiǎn)單,但如果將多個(gè)循環(huán)嵌套則需要追蹤多個(gè)變量,代碼復(fù)雜度會(huì)大大增加,一不小心就錯(cuò)誤使用了其他for循環(huán)的跟蹤變量,從而導(dǎo)致程序出錯(cuò)。迭代器的出現(xiàn)旨在消除這種復(fù)雜性并減少循環(huán)中的錯(cuò)誤

迭代器

迭代器是一種特殊對(duì)象,它具有一些專門為迭代過程設(shè)計(jì)的專有接口,所有的迭代器對(duì)象都有一個(gè)next()方法,每次調(diào)用都返回一個(gè)結(jié)果對(duì)象。結(jié)果對(duì)象有兩個(gè)屬性:一個(gè)是value,表示下一個(gè)將要返回的值;另一個(gè)是done,它是一個(gè)布爾類型的值,當(dāng)沒有更多可返回?cái)?shù)據(jù)時(shí)返回true。迭代器還會(huì)保存一個(gè)內(nèi)部指針,用來指向當(dāng)前集合中值的位置,每調(diào)用一次next()方法,都會(huì)返回下一個(gè)可用的值


如果在最后一個(gè)值返回后再調(diào)用next()方法,那么返回的對(duì)象中屬性done的值為true,屬性value則包含迭代器最終返回的值,這個(gè)返回值不是數(shù)據(jù)集的一部分,它與函數(shù)的返回值類似,是函數(shù)調(diào)用過程中最后一次給調(diào)用者傳遞信息的方法,如果沒有相關(guān)數(shù)據(jù)則返回undefined

下面用ES5的語(yǔ)法創(chuàng)建一個(gè)迭代器

function createIterator(items) { var i = 0; return {  next: function() {   var done = (i >= items.length);   var value = !done ? items[i++] : undefined;   return {    done: done,    value: value   };  } };}var iterator = createIterator([1, 2, 3]);console.log(iterator.next()); // "{ value: 1, done: false }"console.log(iterator.next()); // "{ value: 2, done: false }"console.log(iterator.next()); // "{ value: 3, done: false }"console.log(iterator.next()); // "{ value: undefined, done: true }"// 之后的所有調(diào)用console.log(iterator.next()); // "{ value: undefined, done: true }"

在上面這段代碼中,createIterator()方法返回的對(duì)象有一個(gè)next()方法,每次調(diào)用時(shí),items數(shù)組的下一個(gè)值會(huì)作為value返回。當(dāng)i為3時(shí),done變?yōu)閠rue;此時(shí)三元表達(dá)式會(huì)將value的值設(shè)置為undefined。最后兩次調(diào)用的結(jié)果與ES6迭代器的最終返回機(jī)制類似,當(dāng)數(shù)據(jù)集被用盡后會(huì)返回最終的內(nèi)容

上面這個(gè)示例很復(fù)雜,而在ES6中,迭代器的編寫規(guī)則也同樣復(fù)雜,但ES6同時(shí)還引入了一個(gè)生成器對(duì)象,它可以讓創(chuàng)建迭代器對(duì)象的過程變得更簡(jiǎn)單

生成器

生成器是一種返回迭代器的函數(shù),通過function關(guān)鍵字后的星號(hào)(*)來表示,函數(shù)中會(huì)用到新的關(guān)鍵字yield。星號(hào)可以緊挨著function關(guān)鍵字,也可以在中間添加一個(gè)空格

// 生成器function *createIterator() { yield 1; yield 2; yield 3;}// 生成器能像正規(guī)函數(shù)那樣被調(diào)用,但會(huì)返回一個(gè)迭代器let iterator = createIterator();console.log(iterator.next().value); // 1console.log(iterator.next().value); // 2console.log(iterator.next().value); // 3

在這個(gè)示例中,createlterator()前的星號(hào)表明它是一個(gè)生成器;yield關(guān)鍵字也是ES6的新特性,可以通過它來指定調(diào)用迭代器的next()方法時(shí)的返回值及返回順序。生成迭代器后,連續(xù)3次調(diào)用它的next()方法返回3個(gè)不同的值,分別是1、2和3。生成器的調(diào)用過程與其他函數(shù)一樣,最終返回的是創(chuàng)建好的迭代器

生成器函數(shù)最有趣的部分是,每當(dāng)執(zhí)行完一條yield語(yǔ)句后函數(shù)就會(huì)自動(dòng)停止執(zhí)行。舉個(gè)例子,在上面這段代碼中,執(zhí)行完語(yǔ)句yield 1之后,函數(shù)便不再執(zhí)行其他任何語(yǔ)句,直到再次調(diào)用迭代器的next()方法才會(huì)繼續(xù)執(zhí)行yield 2語(yǔ)句。生成器函數(shù)的這種中止函數(shù)執(zhí)行的能力有很多有趣的應(yīng)用

使用yield關(guān)鍵字可以返回任何值或表達(dá)式,所以可以通過生成器函數(shù)批量地給迭代器添加元素。例如,可以在循環(huán)中使用yield關(guān)鍵字

function *createIterator(items) { for (let i = 0; i < items.length; i++) {  yield items[i]; }}let iterator = createIterator([1, 2, 3]);console.log(iterator.next()); // "{ value: 1, done: false }"console.log(iterator.next()); // "{ value: 2, done: false }"console.log(iterator.next()); // "{ value: 3, done: false }"console.log(iterator.next()); // "{ value: undefined, done: true }"// 之后的所有調(diào)用console.log(iterator.next()); // "{ value: undefined, done: true }"

在此示例中,給生成器函數(shù)createlterator()傳入一個(gè)items數(shù)組,而在函數(shù)內(nèi)部,for循環(huán)不斷從數(shù)組中生成新的元素放入迭代器中,每遇到一個(gè)yield語(yǔ)句循環(huán)都會(huì)停止;每次調(diào)用迭代器的next()方法,循環(huán)會(huì)繼續(xù)運(yùn)行并執(zhí)行下一條yield語(yǔ)句

生成器函數(shù)是ES6中的一個(gè)重要特性,可以將其用于所有支持函數(shù)使用的地方

【使用限制】

yield關(guān)鍵字只可在生成器內(nèi)部使用,在其他地方使用會(huì)導(dǎo)致程序拋出錯(cuò)誤

function *createIterator(items) { items.forEach(function(item) {  // 語(yǔ)法錯(cuò)誤  yield item + 1; });}

從字面上看,yield關(guān)鍵字確實(shí)在createlterator()函數(shù)內(nèi)部,但是它與return關(guān)鍵字一樣,二者都不能穿透函數(shù)邊界。嵌套函數(shù)中的return語(yǔ)句不能用作外部函數(shù)的返回語(yǔ)句,而此處嵌套函數(shù)中的yield語(yǔ)句會(huì)導(dǎo)致程序拋出語(yǔ)法錯(cuò)誤

【生成器函數(shù)表達(dá)式】

也可以通過函數(shù)表達(dá)式來創(chuàng)建生成器,只需在function關(guān)鍵字和小括號(hào)中間添加一個(gè)星號(hào)(*)即可

let createIterator = function *(items) { for (let i = 0; i < items.length; i++) {  yield items[i]; }};let iterator = createIterator([1, 2, 3]);console.log(iterator.next()); // "{ value: 1, done: false }"console.log(iterator.next()); // "{ value: 2, done: false }"console.log(iterator.next()); // "{ value: 3, done: false }"console.log(iterator.next()); // "{ value: undefined, done: true }"// 之后的所有調(diào)用console.log(iterator.next()); // "{ value: undefined, done: true }"

在這段代碼中,createlterator()是一個(gè)生成器函數(shù)表達(dá)式,而不是一個(gè)函數(shù)聲明。由于函數(shù)表達(dá)式是匿名的,因此星號(hào)直接放在function關(guān)鍵字和小括號(hào)之間。此外,這個(gè)示例基本與前例相同,使用的也是for循環(huán)

[注意]不能用箭頭函數(shù)來創(chuàng)建生成器

【生成器對(duì)象的方法】

由于生成器本身就是函數(shù),因而可以將它們添加到對(duì)象中。例如,在ES5風(fēng)格的對(duì)象字面量中,可以通過函數(shù)表達(dá)式來創(chuàng)建生成器

var o = { createIterator: function *(items) {   for (let i = 0; i < items.length; i++) {    yield items[i];   }  }};let iterator = o.createIterator([1, 2, 3]);

也可以用ES6的函數(shù)方法的簡(jiǎn)寫方式來創(chuàng)建生成器,只需在函數(shù)名前添加一個(gè)星號(hào)(*)

var o = { *createIterator(items) {   for (let i = 0; i < items.length; i++) {    yield items[i];   }  }};let iterator = o.createIterator([1, 2, 3]);

這些示例使用了不同于之前的語(yǔ)法,但它們的功能實(shí)際上是等價(jià)的。在簡(jiǎn)寫版本中,由于不使用function關(guān)鍵字來定義createlterator()方法,因此盡管可以在星號(hào)和方法名之間留白,但還是將星號(hào)緊貼在方法名之前

【狀態(tài)機(jī)】

生成器的一個(gè)常用功能是生成狀態(tài)機(jī)

let state = function*(){ while(1){  yield 'A';  yield 'B';  yield 'C'; }}let status = state();console.log(status.next().value);//'A'console.log(status.next().value);//'B'console.log(status.next().value);//'C'console.log(status.next().value);//'A'console.log(status.next().value);//'B'

可迭代對(duì)象

可迭代對(duì)象具有Symbol.iterator屬性,是一種與迭代器密切相關(guān)的對(duì)象。Symbol.iterator通過指定的函數(shù)可以返回一個(gè)作用于附屬對(duì)象的迭代器。在ES6中,所有的集合對(duì)象(數(shù)組、Set集合及Map集合)和字符串都是可迭代對(duì)象,這些對(duì)象中都有默認(rèn)的迭代器。ES6中新加入的特性for-of循環(huán)需要用到可迭代對(duì)象的這些功能

[注意]由于生成器默認(rèn)會(huì)為Symbol.iterator屬性賦值,因此所有通過生成器創(chuàng)建的迭代器都是可迭代對(duì)象

一開始,我們?cè)岬竭^循環(huán)內(nèi)部索引跟蹤的相關(guān)問題,要解決這個(gè)問題,需要兩個(gè)工具:一個(gè)是迭代器,另一個(gè)是for-of循環(huán)。如此一來,便不需要再跟蹤整個(gè)集合的索引,只需關(guān)注集合中要處理的內(nèi)容

for-of循環(huán)每執(zhí)行一次都會(huì)調(diào)用可迭代對(duì)象的next()方法,并將迭代器返回的結(jié)果對(duì)象的value屬性存儲(chǔ)在一個(gè)變量中,循環(huán)將持續(xù)執(zhí)行這一過程直到返回對(duì)象的done屬性的值為true。這里有個(gè)示例

let values = [1, 2, 3];for (let num of values) { //1 //2 //3 console.log(num);}

這段for-of循環(huán)的代碼通過調(diào)用values數(shù)組的Symbol.iterator方法來獲取迭代器,這一過程是在JS引擎背后完成的。隨后迭代器的next()方法被多次調(diào)用,從其返回對(duì)象的value屬性讀取值并存儲(chǔ)在變量num中,依次為1、2和3,當(dāng)結(jié)果對(duì)象的done屬性值為true時(shí)循環(huán)退出,所以num不會(huì)被賦值為undefined

如果只需迭代數(shù)組或集合中的值,用for-of循環(huán)代替for循環(huán)是個(gè)不錯(cuò)的選擇。相比傳統(tǒng)的for循環(huán),for-of循環(huán)的控制條件更簡(jiǎn)單,不需要追蹤復(fù)雜的條件,所以更少出錯(cuò)

[注意]如果將for-of語(yǔ)句用于不可迭代對(duì)象、null或undefined將會(huì)導(dǎo)致程序拋出錯(cuò)誤

【訪問默認(rèn)迭代器】

可以通過Symbol.iterator來訪問對(duì)象默認(rèn)的迭代器

let values = [1, 2, 3];let iterator = values[Symbol.iterator]();console.log(iterator.next()); // "{ value: 1, done: false }"console.log(iterator.next()); // "{ value: 2, done: false }"console.log(iterator.next()); // "{ value: 3, done: false }"console.log(iterator.next()); // "{ value: undefined, done: true }"

在這段代碼中,通過Symbol.iterator獲取了數(shù)組values的默認(rèn)迭代器,并用它遍歷數(shù)組中的元素。在JS引擎中執(zhí)行for-of循環(huán)語(yǔ)句時(shí)也會(huì)有類似的處理過程

由于具有Symbol.iterator屬性的對(duì)象都有默認(rèn)的迭代器,因此可以用它來檢測(cè)對(duì)象是否為可迭代對(duì)象

function isIterable(object) { return typeof object[Symbol.iterator] === "function";}console.log(isIterable([1, 2, 3])); // trueconsole.log(isIterable("Hello")); // trueconsole.log(isIterable(new Map())); // trueconsole.log(isIterable(new Set())); // trueconsole.log(isIterable(new WeakMap())); // falseconsole.log(isIterable(new WeakSet())); // false

這里的islterable()函數(shù)可以檢查指定對(duì)象中是否存在默認(rèn)的函數(shù)類型迭代器,而for-of循環(huán)在執(zhí)行前也會(huì)做相似的檢查

除了使用內(nèi)建的可迭代對(duì)象類型的Symbol.iterator,也可以使用Symbol.iterator來創(chuàng)建屬于自己的迭代器

【創(chuàng)建可迭代對(duì)象】

默認(rèn)情況下,開發(fā)者定義的對(duì)象都是不可迭代對(duì)象,但如果給Symbol.iterator屬性添加一個(gè)生成器,則可以將其變?yōu)榭傻鷮?duì)象

let collection = { items: [], *[Symbol.iterator]() {  for (let item of this.items) {   yield item;  } }};collection.items.push(1);collection.items.push(2);collection.items.push(3);for (let x of collection) { //1 //2 //3 console.log(x);}

在這個(gè)示例中,先創(chuàng)建一個(gè)生成器(注意,星號(hào)仍然在屬性名前)并將其賦值給對(duì)象的Symbol.iterator屬性來創(chuàng)建默認(rèn)的迭代器;而在生成器中,通過for-of循環(huán)迭代this.items并用yield返回每一個(gè)值。collection對(duì)象默認(rèn)迭代器的返回值由迭代器this.items自動(dòng)生成,而非手動(dòng)遍歷來定義返回值

【展開運(yùn)算符和非數(shù)組可迭代對(duì)象】

通過展開運(yùn)算符(...)可以把Set集合轉(zhuǎn)換成一個(gè)數(shù)組

let set = new Set([1, 2, 3, 3, 3, 4, 5]),array = [...set];console.log(array); // [1,2,3,4,5]

這段代碼中的展開運(yùn)算符把Set集合的所有值填充到了一個(gè)數(shù)組字面量里,它可以操作所有可迭代對(duì)象,并根據(jù)默認(rèn)迭代器來選取要引用的值,從迭代器讀取所有值。然后按照返回順序?qū)⑺鼈円来尾迦氲綌?shù)組中。Set集合是一個(gè)可迭代對(duì)象,展開運(yùn)算符也可以用于其他可迭代對(duì)象

let map = new Map([ ["name", "huochai"], ["age", 25]]),array = [...map];console.log(array); // [ ["name", "huochai"], ["age", 25]]

展開運(yùn)算符把Map集合轉(zhuǎn)換成包含多個(gè)數(shù)組的數(shù)組,Map集合的默認(rèn)迭代器返回的是多組鍵值對(duì),所以結(jié)果數(shù)組與執(zhí)行new Map()時(shí)傳入的數(shù)組看起來一樣

在數(shù)組字面量中可以多次使用展開運(yùn)算符,將可迭代對(duì)象中的多個(gè)元素依次插入新數(shù)組中,替換原先展開運(yùn)算符所在的位置

let smallNumbers = [1, 2, 3],bigNumbers = [100, 101, 102],allNumbers = [0, ...smallNumbers, ...bigNumbers];console.log(allNumbers.length); // 7console.log(allNumbers); // [0, 1, 2, 3, 100, 101, 102]

創(chuàng)建一個(gè)變量allNumbers,用展開運(yùn)算符將smallNumbers和bigNumbers里的值依次添加到allNumbers中。首先存入0,然后存入small中的值,最后存入bigNumbers中的值。當(dāng)然,原始數(shù)組中的值只是被復(fù)制到allNumbers中,它們本身并未改變

由于展開運(yùn)算符可以作用于任意可迭代對(duì)象,因此如果想將可迭代對(duì)象轉(zhuǎn)換為數(shù)組,這是最簡(jiǎn)單的方法。既可以將字符串中的每一個(gè)字符(不是編碼單元)存入新數(shù)組中,也可以將瀏覽器中NodeList對(duì)象中的每一個(gè)節(jié)點(diǎn)存入新的數(shù)組中

內(nèi)建迭代器

迭代器是ES6的一個(gè)重要組成部分,在ES6中,已經(jīng)默認(rèn)為許多內(nèi)建類型提供了內(nèi)建迭代器,只有當(dāng)這些內(nèi)建迭代器無法實(shí)現(xiàn)目標(biāo)時(shí)才需要自己創(chuàng)建。通常來說當(dāng)定義自己的對(duì)象和類時(shí)才會(huì)遇到這種情況,否則,完全可以依靠?jī)?nèi)建的迭代器完成工作,而最常使用的可能是集合的那些迭代器

【集合對(duì)象迭代器】

在ES6中有3種類型的集合對(duì)象:數(shù)組、Map集合與Set集合

為了更好地訪問對(duì)象中的內(nèi)容,這3種對(duì)象都內(nèi)建了以下三種迭代器

entries() 返回一個(gè)迭代器,其值為多個(gè)鍵值對(duì)
values() 返回一個(gè)迭代器,其值為集合的值
keys() 返回一個(gè)迭代器,其值為集合中的所有鍵名

調(diào)用以上3個(gè)方法都可以訪問集合的迭代器

entries()迭代器

每次調(diào)用next()方法時(shí),entries()迭代器都會(huì)返回一個(gè)數(shù)組,數(shù)組中的兩個(gè)元素分別表示集合中每個(gè)元素的鍵與值。如果被遍歷的對(duì)象是數(shù)組,則第一個(gè)元素是數(shù)字類型的索引;如果是Set集合,則第一個(gè)元素與第二個(gè)元素都是值(Set集合中的值被同時(shí)作為鍵與值使用);如果是Map集合,則第一個(gè)元素為鍵名

let colors = [ "red", "green", "blue" ];let tracking = new Set([1234, 5678, 9012]);let data = new Map();data.set("title", "Understanding ES6");data.set("format", "ebook");for (let entry of colors.entries()) { console.log(entry);}for (let entry of tracking.entries()) { console.log(entry);}for (let entry of data.entries()) { console.log(entry);}

調(diào)用console.log()方法后輸出以下內(nèi)容

[0, "red"][1, "green"][2, "blue"][1234, 1234][5678, 5678][9012, 9012]["title", "Understanding ES6"]["format", "ebook"]

在這段代碼中,調(diào)用每個(gè)集合的entries()方法獲取一個(gè)迭代器,并使用for-of循環(huán)來遍歷元素,且通過console將每一個(gè)對(duì)象的鍵值對(duì)輸出出來

values()迭代器

調(diào)用values()迭代器時(shí)會(huì)返回集合中所存的所有值

let colors = [ "red", "green", "blue" ];let tracking = new Set([1234, 5678, 9012]);let data = new Map();data.set("title", "Understanding ES6");data.set("format", "ebook");for (let value of colors.values()) { console.log(value);}for (let value of tracking.values()) { console.log(value);}for (let value of data.values()) { console.log(value);}

調(diào)用console.log()方法后輸出以下內(nèi)容

"red""green""blue"123456789012"Understanding ES6""ebook"

如上所示,調(diào)用values()迭代器后,返回的是每個(gè)集合中包含的真正數(shù)據(jù),而不包含數(shù)據(jù)在集合中的位置信息

keys()迭代器

keys()迭代器會(huì)返回集合中存在的每一個(gè)鍵。如果遍歷的是數(shù)組,則會(huì)返回?cái)?shù)字類型的鍵,數(shù)組本身的其他屬性不會(huì)被返回;如果是Set集合,由于鍵與值是相同的,因此keys()和values()返回的也是相同的迭代器;如果是Map集合,則keys()迭代器會(huì)返回每個(gè)獨(dú)立的鍵

let colors = [ "red", "green", "blue" ];let tracking = new Set([1234, 5678, 9012]);let data = new Map();data.set("title", "Understanding ES6");data.set("format", "ebook");for (let key of colors.keys()) { console.log(key);}for (let key of tracking.keys()) { console.log(key);}for (let key of data.keys()) { console.log(key);}

調(diào)用console.log()方法后輸出以下內(nèi)容

012123456789012"title""format"

keys()迭代器會(huì)獲取colors、tracking和data這3個(gè)集合中的每一個(gè)鍵,而且分別在3個(gè)for-of循環(huán)內(nèi)部將這些鍵名打印出來。對(duì)于數(shù)組對(duì)象來說,無論是否為數(shù)組添加命名屬性,打印出來的都是數(shù)字類型的索引;而for-in循環(huán)迭代的是數(shù)組屬性而不是數(shù)字類型的索引

不同集合類型的默認(rèn)迭代器

每個(gè)集合類型都有一個(gè)默認(rèn)的迭代器,在for-of循環(huán)中,如果沒有顯式指定則使用默認(rèn)的迭代器。數(shù)組和Set集合的默認(rèn)迭代器是values()方法,Map集合的默認(rèn)迭代器是entries()方法。有了這些默認(rèn)的迭代器,可以更輕松地在for-of循環(huán)中使用集合對(duì)象

let colors = [ "red", "green", "blue" ];let tracking = new Set([1234, 5678, 9012]);let data = new Map();data.set("title", "Understanding ES6");data.set("format", "print");// 與使用 colors.values() 相同for (let value of colors) { console.log(value);}// 與使用 tracking.values() 相同for (let num of tracking) { console.log(num);}// 與使用 data.entries() 相同for (let entry of data) { console.log(entry);}

上述代碼未指定迭代器,所以將使用默認(rèn)的迭代器。數(shù)組、Set集合及Map集合的默認(rèn)迭代器也會(huì)反應(yīng)出這些對(duì)象的初始化過程,所以這段代碼會(huì)輸出以下內(nèi)容

"red""green""blue"123456789012["title", "Understanding ES6"]["format", "print"]

默認(rèn)情況下,如果是數(shù)組和Set集合,會(huì)逐一返回集合中所有的值。如果是Map集合,則按照Map構(gòu)造函數(shù)參數(shù)的格式返回相同的數(shù)組內(nèi)容。而WeakSet集合與WeakMap集合就沒有內(nèi)建的迭代器,由于要管理弱引用,因而無法確切地知道集合中存在的值,也就無法迭代這些集合了

【字符串迭代器】

自ES5發(fā)布以后,JS字符串慢慢變得更像數(shù)組了,例如,ES5正式規(guī)定可以通過方括號(hào)訪問字符串中的字符(也就是說,text[0]可以獲取字符串text的第一個(gè)字符,并以此類推)。由于方括號(hào)操作的是編碼單元而非字符,因此無法正確訪問雙字節(jié)字符

var message = "A 
注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汉阴县| 山阴县| 柳河县| 托克逊县| 五大连池市| 修文县| 五大连池市| 尖扎县| 乌拉特后旗| 六枝特区| 姚安县| 双桥区| 阜南县| 南皮县| 文山县| 南京市| 巴青县| 民县| 清水县| 普兰店市| 承德县| 诸暨市| 托克托县| 福贡县| 疏附县| 白城市| 晋中市| 永登县| 乐陵市| 施甸县| 云安县| 汶上县| 苗栗市| 剑河县| 中方县| 香港| 大渡口区| 大连市| 静安区| 虹口区| 徐水县|