摘要:學習筆記字符串的擴展字符的表示法允許使用的形式表示一個字符,但在之前,單個碼點僅支持到,超出該范圍的必須用雙字節(jié)形式表示,否則會解析錯誤。返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。,是引入了字符串補全長度的功能。
es6學習筆記-字符串的擴展_v1.0 字符的Unicode表示法
JavaScript 允許使用uxxxx的形式表示一個字符,但在 ES6 之前,單個碼點僅支持u0000到uFFFF,超出該范圍的必須用雙字節(jié)形式表示,否則會解析錯誤。ES6對這一點做出了改進,只要將碼點放入大括號,就能正確解讀該字符,不受限于4位。例如下面的寫法就是合法的,能夠被正確解析:
//在es6后才可以,在es5的時候不行 "u{20BB7}" // "?"codePointAt()
JavaScript內(nèi)部,字符以UTF-16的格式儲存,每個字符固定為2個字節(jié)。
對于那些需要4個字節(jié)儲存的字符(Unicode碼點大于0xFFFF的字符),JavaScript會認為它們是兩個字符。
codePointAt方法,能夠正確處理4個字節(jié)儲存的字符,返回一個字符的碼點。
codePointAt方法會正確返回32位的UTF-16字符的碼點。
注意例子是?,漢字“?”(注意,這個字不是”吉祥“的”吉“)的碼點是0x20BB7,UTF-16編碼為0xD842 0xDFB7(十進制為55362 57271),需要4個字節(jié)儲存。
var s = "?a"; console.log(s.length); //3,?使用了2個字節(jié)來存儲,a使用了一個字節(jié)存儲 console.log(s.codePointAt(0)); // 134071 console.log(s.codePointAt(1)); // 57271 console.log(s.codePointAt(2)); // 97
codePointAt方法是測試一個字符由兩個字節(jié)還是由四個字節(jié)組成的最簡單方法。
function is32Bit(c) { //超過2個字節(jié)組成的字符串的第一位碼點都是大于0xFFFF return c.codePointAt(0) > 0xFFFF; } console.log(is32Bit("?")) // true console.log(is32Bit("a")) // false
ES6 提供了 codePointAt(),能夠正確處理4個字節(jié)存儲的字符,返回一個字符的碼點。
但需要注意的是,這并沒有改變 JavaScript 將2個字節(jié)視為1個字符的事實,只是自動識別出了這是個4字節(jié)的字符并返回了正確的碼點而已
對于單個4字節(jié)的字符(例如"?")來說,charPointAt(0)返回完整字符的十進制碼點,charPointAt(1)返回這個字符的后2個字節(jié)的十進制碼點,效果等同于charCodeAt(1)。
參考
var s = "?a"; for (let ch of s) { //遍歷s字符串,會有2個字符串被遍歷,因為他的長度是2 console.log(ch.codePointAt(0)); } // 134071,能知道這是一個超過四位(2個字節(jié))的字符串(?) // 97,這是一個只需要2位(1個字節(jié))的字符串(a)
編碼格式的檢測:
專家給每種格式和字節(jié)序規(guī)定了一些特殊的編碼,這些編碼在unicode 中是沒有使用的,所以不用擔心會沖突。這個叫做BOM(Byte Order Mark)頭。意思是字節(jié)序標志頭。通過它基本能確定編碼格式和字節(jié)序。
UTF編碼 ║ Byte Order Mark UTF-8 ║ EF BB BF UTF-16LE ║ FF FE UTF-16BE ║ FE FF UTF-32LE ║ FF FE 00 00 UTF-32BE ║ 00 00 FE FF
所以通過檢測文件前面的BOM頭,基本能確定編碼格式和字節(jié)序。但是這個BOM頭只是建議添加,不是強制的,所以不少軟件和系統(tǒng)沒有添加這個BOM頭(所以有些軟件格式中有帶BOM頭和NoBOM頭的選擇)
UTF-16長度相對固定,只要不處理大于U200000范圍的字符,每個Unicode代碼點使用16位即2字節(jié)表示,超出部分使用兩個UTF-16即4字節(jié)表示。按照高低位字節(jié)順序,又分為UTF-16BE/UTF-16LE。參考
String.fromCodePoint()String.fromCodePoint()就是和codePointAt()做相反的操作了。例如:
console.log(String.fromCodePoint(134071)); // "?"字符串的遍歷器接口
這個遍歷器最大的優(yōu)點是可以識別大于0xFFFF的碼點
for (let codePoint of "foo") { console.log(codePoint) } // "f" // "o" // "o" //能識別大于0xFFFF的碼點 var text = String.fromCodePoint(0x20BB7); //用for不行 for (let i = 0; i < text.length; i++) { console.log(text[i]); } // " " // " " //用遍歷器可以 for (let i of text) { console.log(i); } // "?"includes(), startsWith(), endsWith()
傳統(tǒng)上,JavaScript只有indexOf方法,可以用來確定一個字符串是否包含在另一個字符串中。ES6又提供了三種新方法。
includes():返回布爾值,表示是否找到了參數(shù)字符串。
startsWith():返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。
endsWith():返回布爾值,表示參數(shù)字符串是否在源字符串的尾部。
var s = "Hello world!"; //第二個參數(shù)代表開始位置 console.log(s.startsWith("world", 6))// true console.log(s.endsWith("Hello", 5)) // true console.log(s.includes("Hello", 6)) // falserepeat()
repeat方法返回一個新字符串,表示將原字符串重復n次。
console.log("x".repeat(3)) // "xxx" console.log("na".repeat(0)) // "" console.log("na".repeat(2.9)) // "nana" "na".repeat(Infinity)// RangeError "na".repeat(-1)// RangeErrorpadStart(),padEnd()
ES2017(es6是es2016) 引入了字符串補全長度的功能。如果某個字符串不夠指定長度,會在頭部或尾部補全。padStart()用于頭部補全,padEnd()用于尾部補全。
padStart和padEnd一共接受兩個參數(shù),第一個參數(shù)用來指定字符串的最小長度,第二個參數(shù)是用來補全的字符串。
//主要用于補全 console.log("1".padStart(10, "0")); // "0000000001" console.log("12".padStart(10, "0"))// "0000000012" console.log("123456".padStart(10, "0")) // "0000123456"
模板字符串node 6.95還不支持,現(xiàn)在是用babel-node來測試的
使用反引號,反引號代替以前的單引號或者雙引號
使用大括號支持任意的JavaScript表達式,可以進行運算,以及引用對象屬性和函數(shù)
// 普通字符串 `In JavaScript " " is a line-feed.` // 多行字符串 `In JavaScript this is not legal.` console.log(`string text line 1 string text line 2`); // 字符串中嵌入變量 var name = "Bob", time = "today"; `Hello ${name}, how are you ${time}?` //如果在模板字符串中需要使用反引號,則前面要用反斜杠轉義。 var greeting = ``Yo` World!`; //使用大括號的情況 var x = 1; var y = 2; `${x} + ${y} = ${x + y}` // "1 + 2 = 3" `${x} + ${y * 2} = ${x + y * 2}` // "1 + 4 = 5" var obj = {x: 1, y: 2}; `${obj.x + obj.y}` // 3 //模板字符串之中還能調(diào)用函數(shù),要用大括號 function fn() { return "Hello World"; } `foo ${fn()} bar` // foo Hello World bar
傳統(tǒng)寫法vs新寫法
//傳統(tǒng)寫法 $("#result").append( "There are " + basket.count + " " + //不斷用+號連接 "items in your basket, " + "" + basket.onSale + " are on sale!" ); //新寫法 $("#result").append(` //一個反引號括起來,然后直接寫,用大括號包括變量 There are ${basket.count} items in your basket, ${basket.onSale} are on sale! `); //模板字符串中嵌入變量,需要將變量名寫在${}之中。 function authorize(user, action) { if (!user.hasPrivilege(action)) { throw new Error( // 傳統(tǒng)寫法為 // "User " // + user.name // + " is not authorized to do " // + action // + "." //新寫法 `User ${user.name} is not authorized to do ${action}.`); } }
模板嵌套
map() 方法創(chuàng)建一個新數(shù)組,其結果是該數(shù)組中的每個元素調(diào)用一個提供的函數(shù)。
const tmpl = addrs => ` //箭頭后面跟的是反引號
${addr.first} |
${addr.last} |
Bond |
Lars |
如果需要引用模板字符串本身,在需要時執(zhí)行,可以像下面這樣寫。
// 寫法一 let str = "return " + "`Hello ${name}!`";//將模板本身保存起來為變量 let func = new Function("name", str); //作為functionBody使用 func("Jack") // "Hello Jack!" // 寫法二 let str = "(name) => `Hello ${name}!`"; let func = eval.call(null, str); //不建議使用eval func("Jack") // "Hello Jack!"
new Function ([arg1[, arg2[, ...argN]],] functionBody)
參數(shù)arg1, arg2, ... argN:被函數(shù)使用的參數(shù)的名稱必須是合法命名的。
functionBody:一個含有包括函數(shù)定義的JavaScript語句的字符串。
參考引用:
es6字符串擴展
每天一點ES6(5):字符串的擴展
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86911.html
摘要:學習筆記數(shù)值的擴展有一些不常用或者還不支持的就沒有記錄了總體來說本篇只是一個備忘而已用來檢查一個數(shù)值是否為有限的。兩個新方法只對數(shù)值有效,非數(shù)值一律返回。參考引用數(shù)值擴展 es6學習筆記-數(shù)值的擴展 有一些不常用或者還不支持的就沒有記錄了,總體來說本篇只是一個備忘而已 Number.isFinite(), Number.isNaN() Number.isFinite()用來檢查一個數(shù)值...
摘要:學習筆記函數(shù)擴展函數(shù)參數(shù)的默認值如果參數(shù)默認值是變量,那么參數(shù)就不是傳值的,而是每次都重新計算默認值表達式的值。屬性函數(shù)的屬性,返回該函數(shù)的函數(shù)名。箭頭函數(shù)詳細鏈接參考引用函數(shù)擴展 es6學習筆記-函數(shù)擴展_v1.0 函數(shù)參數(shù)的默認值 function Point(x = 0, y = 0) { this.x = x; this.y = y; } var p = ne...
摘要:考慮到環(huán)境導致的行為差異太大,應該避免在塊級作用域內(nèi)聲明函數(shù)。函數(shù)聲明語句函數(shù)表達式循環(huán)循環(huán)還有一個特別之處,就是循環(huán)語句部分是一個父作用域,而循環(huán)體內(nèi)部是一個單獨的子作用域。聲明一個只讀的常量。 es6學習筆記-let,const和塊級作用域_v1.0 塊級作用域 javascript 原來是沒有塊級作用域的,只有全局作用域和函數(shù)作用域 例子1 因為沒有塊級作用域,所以每次的i都是一...
摘要:學習筆記字符串模板實例模板編譯先組成一個模板使用放置代碼使用輸出表達式。這被稱為標簽模板功能。該數(shù)組的成員與數(shù)組完全一致參考引用字符串擴展 es6學習筆記-字符串模板_v1.0 實例:模板編譯 //先組成一個模板 var template = ` //使用放置JavaScript代碼 //使用輸出JavaScript表達式。 `; //這是編譯模板的函數(shù),將模...
摘要:學習筆記頂層對象雖然是筆記但是基本是抄了一次大師的文章了頂層對象頂層對象,在瀏覽器環(huán)境指的是對象,在指的是對象。之中,頂層對象的屬性與全局變量是等價的。的寫法模塊的寫法上面代碼將頂層對象放入變量。參考引用頂層對象實戰(zhàn) es6學習筆記-頂層對象_v1.0 (雖然是筆記,但是基本是抄了一次ruan大師的文章了) 頂層對象 頂層對象,在瀏覽器環(huán)境指的是window對象,在Node指的是gl...
閱讀 1325·2021-11-11 11:00
閱讀 3041·2021-09-24 09:47
閱讀 4951·2021-09-22 15:53
閱讀 960·2021-09-10 10:50
閱讀 3207·2021-09-01 11:40
閱讀 1160·2019-08-30 15:55
閱讀 473·2019-08-30 12:49
閱讀 1049·2019-08-29 17:12