3 字符串的扩大

字符Unicode的示意法

javascript许可采纳 \uxxxx(Unicode码点) 情势示意一个字符。然则,这类示意法只限于码点在\u0000 ~ \uFFFF之间的字符,超越这个局限的字符,必须用两个双字节的情势示意。

"\u20BB7"---会理解为 "\u20BB+7" // " 7"

ES6 对这一点做出了革新,只须要将码点放入大括号,就可以准确解读该字符

"\u{20BB7}" //"?"
"\u{41}\u{42}\u{43}" //ABC
let hello = 123;
hell\u{6F} // 123
"\u{1F680}" === "\uD83D\uDE80" // true

有了这类示意法以后,Javascript共有6种要领可以示意一个字符

'\z' === 'z'  //true
'\172' === 'z'  //true
'\x7A' === 'z'  //true
'\u007A' === 'z'  //true
'\u{7A}' === 'z'  //true

codePoint()

JavaScript内部,字符以UTF-16的花样贮存,每一个字符固定为2个字节。关于那些须要4个字节贮存的字符(Unicode码点大于0xFFFF的字符),JavaScript会以为它们是两个字符。

var s = "?";
s.length // 2
s.charAt(0) // ''
s.charAt(1) // ''
s.charCodeAt(0) // 55362
s.charCodeAt(1) // 57271

ES6供应了 codePointAt要领,可以准确处理4个字节贮存的字符,返回一个字符的码点

var s = '?a';
s.codePointAt(0) // 134071
s.codePointAt(1) // 57271
s.codePointAt(2) // 97

codePointAt要领的参数,是字符在字符串中的位置(从0最先)。上面代码中,JavaScript将“?a”视为三个字符,codePointAt要领在第一个字符上,准确地辨认了“?”,返回了它的十进制码点134071(即十六进制的20BB7)。在第二个字符(即“?”的后两个字节)和第三个字符“a”上,codePointAt要领的结果与charCodeAt要领雷同。

总之,codePointAt要领会准确返回32位的UTF-16字符的码点。关于那些两个字节贮存的通例字符,它的返回结果与charCodeAt要领雷同。

codePointAt要领返回的是码点的十进制值,假如想要十六进制的值,可以运用toString要领转换一下。

var s = '?a';
s.codePointAt(0).toString(16) // "20bb7"
s.codePointAt(2).toString(16) // "61"

你能够注重到了,codePointAt要领的参数,仍然是不准确的。比方,上面代码中,字符a在字符串s的准确位置序号应该是1,然则必须向codePointAt要领传入2。处理这个题目的一个方法是运用for...of1轮回,由于它会准确辨认32位的UTF-16字符。

var s = '?a';
for (let ch of s) {
  console.log(ch.codePointAt(0).toString(16));
}
// 20bb7
// 61

codePointAt要领是测试一个字符由两个字节照样由四个字节构成的最简朴要领。

function is32Bit(c) {
  return c.codePointAt(0) > 0xFFFF;
} 
is32Bit("?") // true
is32Bit("a") // false
  1. for-in 轮回用来遍历对象属性;for-of 轮回用来遍历数据-比方数组中的值,然则不仅如此它还支撑:大多数类数组对象、字符串遍历(将字符串视为一系列的Unicode字符举行遍历)、Map对象遍历、Set对象遍历
    原文作者:懒惰的小白
    原文地址: https://segmentfault.com/a/1190000010463414
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞