摘要:字符的表示法允許采用碼點形式表示一個字符。但是,這種表示法只限于碼點在之間的字符,超出這個范圍的字符,必須用兩個雙字節(jié)的形式表示。比如,上面代碼中,字符在字符串的正確位置序號應(yīng)該是,但是必須向方法傳入。
字符Unicode的表示法
javascript允許采用 uxxxx(Unicode碼點) 形式表示一個字符。但是,這種表示法只限于碼點在u0000 ~ uFFFF之間的字符,超出這個范圍的字符,必須用兩個雙字節(jié)的形式表示。
"u20BB7"---會理解為 "u20BB+7" // " 7"
ES6 對這一點做出了改進(jìn),只需要將碼點放入大括號,就能正確解讀該字符
"u{20BB7}" //"?" "u{41}u{42}u{43}" //ABC let hello = 123; hellu{6F} // 123 "u{1F680}" === "uD83DuDE80" // true
有了這種表示法之后,Javascript共有6種方法可以表示一個字符
"z" === "z" //true "172" === "z" //true "x7A" === "z" //true "u007A" === "z" //true "u{7A}" === "z" //truecodePoint()
JavaScript內(nèi)部,字符以UTF-16的格式儲存,每個字符固定為2個字節(jié)。對于那些需要4個字節(jié)儲存的字符(Unicode碼點大于0xFFFF的字符),JavaScript會認(rèn)為它們是兩個字符。
var s = "?"; s.length // 2 s.charAt(0) // "" s.charAt(1) // "" s.charCodeAt(0) // 55362 s.charCodeAt(1) // 57271
ES6提供了 codePointAt方法,能夠正確處理4個字節(jié)儲存的字符,返回一個字符的碼點
var s = "?a"; s.codePointAt(0) // 134071 s.codePointAt(1) // 57271 s.codePointAt(2) // 97
codePointAt方法的參數(shù),是字符在字符串中的位置(從0開始)。上面代碼中,JavaScript將“?a”視為三個字符,codePointAt方法在第一個字符上,正確地識別了“?”,返回了它的十進(jìn)制碼點134071(即十六進(jìn)制的20BB7)。在第二個字符(即“?”的后兩個字節(jié))和第三個字符“a”上,codePointAt方法的結(jié)果與charCodeAt方法相同。
總之,codePointAt方法會正確返回32位的UTF-16字符的碼點。對于那些兩個字節(jié)儲存的常規(guī)字符,它的返回結(jié)果與charCodeAt方法相同。
codePointAt方法返回的是碼點的十進(jìn)制值,如果想要十六進(jìn)制的值,可以使用toString方法轉(zhuǎn)換一下。
var s = "?a"; s.codePointAt(0).toString(16) // "20bb7" s.codePointAt(2).toString(16) // "61"
你可能注意到了,codePointAt方法的參數(shù),仍然是不正確的。比如,上面代碼中,字符a在字符串s的正確位置序號應(yīng)該是1,但是必須向codePointAt方法傳入2。解決這個問題的一個辦法是使用for...of1循環(huán),因為它會正確識別32位的UTF-16字符。
var s = "?a"; for (let ch of s) { console.log(ch.codePointAt(0).toString(16)); } // 20bb7 // 61
codePointAt方法是測試一個字符由兩個字節(jié)還是由四個字節(jié)組成的最簡單方法。
function is32Bit(c) { return c.codePointAt(0) > 0xFFFF; } is32Bit("?") // true is32Bit("a") // false
for-in 循環(huán)用來遍歷對象屬性;for-of 循環(huán)用來遍歷數(shù)據(jù)-例如數(shù)組中的值,但是不僅如此它還支持:大多數(shù)類數(shù)組對象、字符串遍歷(將字符串視為一系列的Unicode字符進(jìn)行遍歷)、Map對象遍歷、Set對象遍歷 ?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84582.html
摘要:模板字符串甚至還能嵌套解構(gòu)賦值允許按照一定模式,從數(shù)組和對象中提取值,對變量進(jìn)行賦值,這被稱為解構(gòu)。運算符使用場景應(yīng)該稍少一些,主要是處理不定數(shù)量參數(shù),可以避免對象的使用。 es6中較為常用的書寫風(fēng)格 為了書寫的方便,es6中提出了很多比較友好的書寫方式,其中最為常見的屬于以下幾個: 字符串模板 `abcdef${test}` 解構(gòu)賦值 let [a, b, c] = [1,...
摘要:項目實戰(zhàn)教程第章擴(kuò)展函數(shù)與屬性在使用的時候,我們經(jīng)常使用諸如等等一堆工具類,代碼寫起來也比較冗長。本章我們介紹的擴(kuò)展函數(shù)和屬性。擴(kuò)展函數(shù)中提供了非常簡單使用的擴(kuò)展函數(shù)功能。 《Kotlin 項目實戰(zhàn)教程》 第6章 擴(kuò)展函數(shù)與屬性 在使用Java的時候,我們經(jīng)常使用諸如StringUtil, DateUtil等等一堆工具類,代碼寫起來也比較冗長。舉個例子,獲取一個字符串的第一個字符值、最...
摘要:字符串的擴(kuò)展字符串的遍歷器接口字符串可以被循環(huán)遍歷。即能識別編號大于查詢字符串是否包含某個字符返回布爾值,表示是否找到了參數(shù)字符串。返回布爾值,表示參數(shù)字符串是否在原字符串的頭部。 字符串的擴(kuò)展 1.字符串的遍歷器接口 字符串可以被for...of循環(huán)遍歷。 與es5的比較for循環(huán)雖可以遍歷字符串,但不能識別大于oxFFFF的編碼; 2.位置 --> 字符/碼點 根據(jù)指定位置返回對應(yīng)...
摘要:中對字符串函數(shù)對象數(shù)組等都進(jìn)行了擴(kuò)展,感覺目的呢就是完善一下所為外行人詬病的一些偽其實個人覺得不完美的才是真的美,什么東西都無懈可擊了就顯得不夠有趣了。 ES6中對字符串、函數(shù)、對象、數(shù)組等都進(jìn)行了擴(kuò)展,感覺目的呢就是完善一下JS所為外行人詬病的一些偽bug.其實個人覺得不完美的JS才是真的美,什么東西都無懈可擊了就顯得不夠有趣了。好了,接下來又要開始拾人牙慧了... 主要講解: ...
摘要:為要檢測的對象構(gòu)造函數(shù)創(chuàng)建的對象繼承了一個叫的屬性,該屬性指代該構(gòu)造函數(shù),即的原型。使用直接量創(chuàng)建的對象,也有一個叫的屬性,該屬性指代構(gòu)造函數(shù),所以直接量創(chuàng)建的對象的真正原型是,使用方法來檢測對象的原型并不可靠,在以后的文章中會提到。 一、原型屬性 1、對象的原型屬性是用來繼承屬性的,這個屬性如此重要,我們通常稱為:對象的原型屬性或?qū)ο蟮脑?。對象的原型是在對象實例化的時候就設(shè)置好的...
閱讀 1854·2021-08-19 11:12
閱讀 1429·2021-07-25 21:37
閱讀 991·2019-08-30 14:07
閱讀 1271·2019-08-30 13:12
閱讀 655·2019-08-30 11:00
閱讀 3533·2019-08-29 16:28
閱讀 996·2019-08-29 15:33
閱讀 2976·2019-08-26 13:40