资讯专栏INFORMATION COLUMN

3 字符串的扩展

ssshooter / 1208人阅读

摘要:字符的表示法允许采用码点形式表示一个字符。但是,这种表示法只限于码点在之间的字符,超出这个范围的字符,必须用两个双字节的形式表示。比如,上面代码中,字符在字符串的正确位置序号应该是,但是必须向方法传入。

字符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"  //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

for-in 循环用来遍历对象属性;for-of 循环用来遍历数据-例如数组中的值,但是不仅如此它还支持:大多数类数组对象、字符串遍历(将字符串视为一系列的Unicode字符进行遍历)、Map对象遍历、Set对象遍历 ↩

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84582.html

相关文章

  • es6解构赋值、扩展运算符、rest参数使用

    摘要:模板字符串甚至还能嵌套解构赋值允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。运算符使用场景应该稍少一些,主要是处理不定数量参数,可以避免对象的使用。 es6中较为常用的书写风格 为了书写的方便,es6中提出了很多比较友好的书写方式,其中最为常见的属于以下几个: 字符串模板 `abcdef${test}` 解构赋值 let [a, b, c] = [1,...

    xuweijian 评论0 收藏0
  • 第6章 扩展函数与属性

    摘要:项目实战教程第章扩展函数与属性在使用的时候,我们经常使用诸如等等一堆工具类,代码写起来也比较冗长。本章我们介绍的扩展函数和属性。扩展函数中提供了非常简单使用的扩展函数功能。 《Kotlin 项目实战教程》 第6章 扩展函数与属性 在使用Java的时候,我们经常使用诸如StringUtil, DateUtil等等一堆工具类,代码写起来也比较冗长。举个例子,获取一个字符串的第一个字符值、最...

    wangdai 评论0 收藏0
  • es6学习笔记--符串扩展、数组扩展、对象扩展

    摘要:字符串的扩展字符串的遍历器接口字符串可以被循环遍历。即能识别编号大于查询字符串是否包含某个字符返回布尔值,表示是否找到了参数字符串。返回布尔值,表示参数字符串是否在原字符串的头部。 字符串的扩展 1.字符串的遍历器接口 字符串可以被for...of循环遍历。 与es5的比较for循环虽可以遍历字符串,但不能识别大于oxFFFF的编码; 2.位置 --> 字符/码点 根据指定位置返回对应...

    不知名网友 评论0 收藏0
  • ES6之数组扩展

    摘要:中对字符串函数对象数组等都进行了扩展,感觉目的呢就是完善一下所为外行人诟病的一些伪其实个人觉得不完美的才是真的美,什么东西都无懈可击了就显得不够有趣了。 ES6中对字符串、函数、对象、数组等都进行了扩展,感觉目的呢就是完善一下JS所为外行人诟病的一些伪bug.其实个人觉得不完美的JS才是真的美,什么东西都无懈可击了就显得不够有趣了。好了,接下来又要开始拾人牙慧了... 主要讲解: ...

    Warren 评论0 收藏0
  • 与JavaScript恋爱之对象三个属性

    摘要:为要检测的对象构造函数创建的对象继承了一个叫的属性,该属性指代该构造函数,即的原型。使用直接量创建的对象,也有一个叫的属性,该属性指代构造函数,所以直接量创建的对象的真正原型是,使用方法来检测对象的原型并不可靠,在以后的文章中会提到。 一、原型属性 1、对象的原型属性是用来继承属性的,这个属性如此重要,我们通常称为:对象的原型属性或对象的原型。对象的原型是在对象实例化的时候就设置好的...

    wanglu1209 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<