摘要:字符的表示法允许采用码点形式表示一个字符。但是,这种表示法只限于码点在之间的字符,超出这个范围的字符,必须用两个双字节的形式表示。比如,上面代码中,字符在字符串的正确位置序号应该是,但是必须向方法传入。
字符Unicode的表示法
javascript允许采用 uxxxx(Unicode码点) 形式表示一个字符。但是,这种表示法只限于码点在u0000 ~ uFFFF之间的字符,超出这个范围的字符,必须用两个双字节的形式表示。
"u20BB7"---会理解为 "u20BB+7" // " 7"
ES6 对这一点做出了改进,只需要将码点放入大括号,就能正确解读该字符
"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内部,字符以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
for-in 循环用来遍历对象属性;for-of 循环用来遍历数据-例如数组中的值,但是不仅如此它还支持:大多数类数组对象、字符串遍历(将字符串视为一系列的Unicode字符进行遍历)、Map对象遍历、Set对象遍历 ↩
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/84582.html
摘要:模板字符串甚至还能嵌套解构赋值允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。运算符使用场景应该稍少一些,主要是处理不定数量参数,可以避免对象的使用。 es6中较为常用的书写风格 为了书写的方便,es6中提出了很多比较友好的书写方式,其中最为常见的属于以下几个: 字符串模板 `abcdef${test}` 解构赋值 let [a, b, c] = [1,...
摘要:项目实战教程第章扩展函数与属性在使用的时候,我们经常使用诸如等等一堆工具类,代码写起来也比较冗长。本章我们介绍的扩展函数和属性。扩展函数中提供了非常简单使用的扩展函数功能。 《Kotlin 项目实战教程》 第6章 扩展函数与属性 在使用Java的时候,我们经常使用诸如StringUtil, DateUtil等等一堆工具类,代码写起来也比较冗长。举个例子,获取一个字符串的第一个字符值、最...
摘要:字符串的扩展字符串的遍历器接口字符串可以被循环遍历。即能识别编号大于查询字符串是否包含某个字符返回布尔值,表示是否找到了参数字符串。返回布尔值,表示参数字符串是否在原字符串的头部。 字符串的扩展 1.字符串的遍历器接口 字符串可以被for...of循环遍历。 与es5的比较for循环虽可以遍历字符串,但不能识别大于oxFFFF的编码; 2.位置 --> 字符/码点 根据指定位置返回对应...
摘要:为要检测的对象构造函数创建的对象继承了一个叫的属性,该属性指代该构造函数,即的原型。使用直接量创建的对象,也有一个叫的属性,该属性指代构造函数,所以直接量创建的对象的真正原型是,使用方法来检测对象的原型并不可靠,在以后的文章中会提到。 一、原型属性 1、对象的原型属性是用来继承属性的,这个属性如此重要,我们通常称为:对象的原型属性或对象的原型。对象的原型是在对象实例化的时候就设置好的...
阅读 1789·2021-08-19 11:12
阅读 1373·2021-07-25 21:37
阅读 946·2019-08-30 14:07
阅读 1240·2019-08-30 13:12
阅读 622·2019-08-30 11:00
阅读 3501·2019-08-29 16:28
阅读 954·2019-08-29 15:33
阅读 2926·2019-08-26 13:40