[toc]
1、字符的Unicode表示法
ES6之前 Unicode 只能表示 \u0000 -- \uFFFF 之间的字符。 ES6可以表示超过这个 范围的unicode字符 如
1//原来 ES6 之前 2"\uD842\uDFB7" 3// "𠮷" 4 5"\u20BB7" 6// " 7" 7 8// ES6 9 10"\u{20bb7}" 11// "𠮷" 12 13//🚀 14"\u{1F680}" === "\uD83D\uDE80" 15
好多中文是的Unicode是超过 \uFFFF 的,有了这种表示,我们就可以用一个字节 表示表示一个字符而不像原来用两个字节。
JavaScript 的6中表示一个字符的方法
1'\z' === 'z' // true 2'\172' === 'z' // true 3'\x7A' === 'z' // true 4'\u007A' === 'z' // true 5'\u{7A}' === 'z' // true
2、字符串的遍历接口
for...of
他的优点 普通的for循环,不能识别编码大于 '\uffff' 的码点字符会把它拆分为两个
1//普通遍历会把超表示范围的码点 是被为两个,拆分后如果是不可打印字符会输出空 2let text = String.fromCodePoint(0x20BB7) 3for (let i = 0;i < text.length; i++){ 4 console.log(text[i]); 5} 6//"�" 7//"�" 8 9// 用 for...of 10for (let i of text) { 11 console.log(i); 12} 13// "𠮷"
3、直接输入 U+2028 和 U+2029(分行符 和 分段符)
JavaScript 规定有5个字符,不能在字符串里面直接使用,只能使用转义形式。 U+005C:反斜杠(reverse solidus) U+000D:回车(carriage return) U+2028:行分隔符(line separator) U+2029:段分隔符(paragraph separator) U+000A:换行符(line feed) 例如想输出 反斜杠\ 只能先转意 \ 或者 \005c
4、JSON.stringify() 的改造
根据标准,JSON 数据必须是 UTF-8 编码。但是,现在的JSON.stringify()方法有可能返回不符合 UTF-8 标准的字符串。 具体来说,UTF-8 标准规定,0xD800到0xDFFF之间的码点,不能单独使用,必须配对使用。比如,\uD834\uDF06是两个码点,但是必须放在一起配对使用,代表字符𝌆。这是为了表示码点大于0xFFFF的字符的一种变通方法。单独使用\uD834和\uDFO6这两个码点是不合法的,或者颠倒顺序也不行,因为\uDF06\uD834并没有对应的字符。 JSON.stringify()的问题在于,它可能返回0xD800到0xDFFF之间的单个码点。 JSON.stringify('\u{D834}') // "\u{D834}" 为了确保返回的是合法的 UTF-8 字符,ES2019 改变了JSON.stringify()的行为。如果遇到0xD800到0xDFFF之间的单个码点,或者不存在的配对形式,它会返回转义字符串,留给应用自己决定下一步的处理。
JSON.stringify('\u{D834}') // ""\uD834"" JSON.stringify('\uDF06\uD834') // ""\udf06\ud834""
5、字符串模版 用反引号包裹
1// 普通字符串 2`In JavaScript '\n' is a line-feed.` 3 4// 多行字符串 5`In JavaScript this is 6 not legal.` 7 8console.log(`string text line 1 9string text line 2`); 10 11// 字符串中嵌入变量 12let name = "Bob", time = "today"; 13`Hello ${name}, how are you ${time}?`
字符串模版中要包含 反引号 ` 就需要用转移字符
1let greeting = `\`Yo\` World!`; 2
使用字符串模版表示多行字符串,所有的空格和缩进都会被保存在输出之中
1$('#list').html(` 2<ul> 3 <li>first</li> 4 <li>second</li> 5</ul> 6`);
字符模版中可以嵌入变量 ,不过要用 ${var} 包裹,
1function authorize(user, action) { 2 if (!user.hasPrivilege(action)) { 3 throw new Error( 4 // 传统写法为 5 // 'User ' 6 // + user.name 7 // + ' is not authorized to do ' 8 // + action 9 // + '.' 10 `User ${user.name} is not authorized to do ${action}.`); 11 } 12}
字符模版中可以写表达式 字符串模板中可以调用函数
1function fn() { 2 return "Hello World"; 3} 4 5`foo ${fn()} bar`
字符串模板可以嵌套
1const tmpl = addrs => ` 2 <table> 3 ${addrs.map(addr => ` 4 <tr><td>${addr.first}</td></tr> 5 <tr><td>${addr.last}</td></tr> 6 `).join('')} 7 </table> 8`;
6、标签模板
1alert `123` 2//等同于 3alert(123)
字符串模板紧跟在一个函数名之后。形成一个函数调用的功能。
[字符串扩展](http://es6.ruanyifeng.com/#docs/string 字符串扩展)