ECMAScript6 新特性——“字符串的扩展”
1 字符串的Unicode表示法
ES6 只要將碼點放入大括號,就能正確解讀該字符;
var x = "\u20bb7"; document.write(x); //?7 var x = "\u{20bb7}"; document.write(x); //? 可正確返回2 codePointAt()
JavaScript對于那些需要4個字節儲存的字符(Unicode碼點大于0xFFFF的字符),JavaScript會認為它們是兩個字符。
var s = "?";s.length // 2 s.charAt(0) // '' s.charAt(1) // '' s.charCodeAt(0) // 55362 s.charCodeAt(1) // 57271ES6提供了codePointAt方法,能夠正確處理4個字節儲存的字符,返回一個字符的碼點。
var x = "\u{20bb7}"; console.log(x); //吉 console.log(x.length); console.log(x.codePointAt(0)); //134071 console.log(x.codePointAt(0).toString(16)); //20bb7 console.log(x.codePointAt(1)); //57271codePointAt(0)返回的是十進制碼點;codePointAt(1)則返回的結果與charCodeAt方法返回的結果相同
3 String.fromCodePoint()
ES5提供String.fromCharCode方法,用于從碼點返回對應字符,但是這個方法不能識別32位的UTF-16字符(Unicode編號大于0xFFFF)。
ES6提供了String.fromCodePoint方法,可以識別0xFFFF的字符,彌補了String.fromCharCode方法的不足。在作用上,正好與codePointAt方法相反。
console.log(String.fromCharCode("0x20bb7")); //? console.log(String.fromCodePoint("0x20bb7")); //吉4 字符串的遍歷器接口
ES6為字符串添加了遍歷器接口,使得字符串可以被for...of循環遍歷。
這個遍歷器最大的優點是可以識別大于0xFFFF的碼點
var text = String.fromCodePoint("0x20bb7"); //吉 for (let i = 0; i < text.length; i++) {console.log(text[i]);//�//� } for (let codePoint of text) {console.log(codePoint); //? }5 at()
ES7為字符串實例提供了at方法,可以識別Unicode編號大于0xFFFF的字符。
6 normalize()
ES6提供字符串實例的normalize()方法,用來將字符的不同表示方法統一為同樣的形式,這稱為Unicode正規化。
'\u01D1'.normalize() === '\u004F\u030C'.normalize() // true不過,normalize方法目前不能識別三個或三個以上字符的合成。
7 includes(),startsWith(),endsWith()
傳統上,JavaScript只有indexOf方法,可以用來確定一個字符串是否包含在另一個字符串中。ES6又提供了三種新方法。
includes():返回布爾值,表示是否找到了參數字符串。
startsWith():返回布爾值,表示參數字符串是否在源字符串的頭部。
endsWith():返回布爾值,表示參數字符串是否在源字符串的尾部。
var str = "string"; console.log(str.includes("r")); //True console.log(str.startsWith("str")); //True console.log(str.endsWith("g")); //True
另外,他們都支持第二個參數用來表示開始搜索的位置,但endsWith針對的則是前n個字符
8 repeat()
repeat方法返回一個新字符串,表示將原字符串重復n次。
var str = "string"; console.log(str.repeat(2)); //stringstring9 padStart(),padEnd()
padStart用于頭部補全,padEnd用于尾部補全。
兩個參數:1個是最小字符串長度;另一個是補全的字符串
10 模板字符串
模板字符串(template string)是增強版的字符串,用反引號(`)標識。它可以當作普通字符串使用,也可以用來定義多行字符串,或者在字符串中嵌入變量。
var name = "Oliver"; //變量 var info = `hello worldwelcome you`; //多行字符串 console.log(`hello ${name}`,info); //嵌套變量,輸出多行字符串變量應該寫在${}大括號里面,并且可以放入任意的JS表達式;
11 標簽模板
下面的例子實際上是函數參數如下的調用:
tag(["Hello ", "; Infomation: ", ""],Oliver,welcome to use the system.);tag函數寫法如下:
let user = {name: "Oliver",info: "welcome to use the system." }; tag`Hello ${user.name}; Infomation: ${user.info}`; function tag(s, v1, v2) {console.log(s); //["Hello ", "; Infomation: ", ""]console.log(v1); //Oliverconsole.log(v2); //welcome to use the system. }12 String.raw()
String.raw方法,往往用來充當模板字符串的處理函數,返回一個斜杠都被轉義(即斜杠前面再加一個斜杠)的字符串,對應于替換變量后的模板字符串。
String.raw`Hi\n${2+3}!`; // "Hi\\n5!"String.raw`Hi\u000A!`; // 'Hi\\u000A!'String.raw方法也可以作為正常的函數使用。這時,它的第一個參數,應該是一個具有raw屬性的對象,且raw屬性的值應該是一個數組。
String.raw({ raw: 'test' }, 0, 1, 2); // 't0e1s2t'// 等同于 String.raw({ raw: ['t','e','s','t'] }, 0, 1, 2);總結
以上是生活随笔為你收集整理的ECMAScript6 新特性——“字符串的扩展”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从fread和mmap 谈读文件的性能
- 下一篇: 一次发现underscore源码bug的