ES6标准入门 第四章:字符串的扩展

1、字符串的Unicode 表示法

JavaScript 允许采用 \uxxxx 表示一个字符,其中 xxxx 表示字符的码点。

"\u0061"     // "a"

ES5中的缺陷:

以上表示法只限于 \u0000——\uFFFF 之间的字符。超出这个范围的=字符,必须用两个双字节表示。

"\uD842\uDFB7"    //"??"

如果直接在\u 后面直接加上超过\uFFFF 的数值:

"\u20BB7"     // "  7"

如上代码,JavaScript会理解成  “\u20BB+7” 。由于\u20BB 是一个不可打印字符, 所以显示一个空格。

ES6的改进:

只要将码点放入大括号,就能正确解读改字符。

"\u{20BB7}"    // "??"

"\u{41}\u{42}\u{43}"     // "ABC"

let hello = 123;
hell\u{6F} // 123
‘\u{1F680}‘ === ‘\uD83D\uDE80‘    // true    此行代码表示:大括号表示法 与 四字节的UTF-16编码是等价的。

在JavaScript 中共有6种方法可以表示一个字符:

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

2、codePointAt()

JavaScript 内部,字符以UTF-16 的格式存储,每个字符固定为2字节。 对于Unicode 码点大于0xFFFF 的字符(需要4个字节存储),js会认为它们是2 个字符。

ES5的缺陷:

var s = "??";

s.length // 2
s.charCodeAt(0) // 55362
s.charCodeAt(1) // 57271

上面的代码中,?? 的码点是0x20BB7,UTF-16 编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节储存。

对于这种四字节字符,JavaScript不能正确处理,字符串长度会被误认为2;charCodeAt 方法只能分别返回前两个字节的值 和 后两个字节的值。

ES6 的改进:

提供了codePointAt方法,能够正确处理4 字节字符,返回一个32位的UTF-16字符的码点。(返回的码点是十进制的)

let s = ‘??a‘;

s.codePointAt(0) // 134071
s.codePointAt(1) // 57271
s.codePointAt(2) // 97

参数为字符在字符串中的位置(从0开始); 对于两个字节存储的常规字符,它的返回结果与charCodeAt方法相同。

若要codePointAt方法返回的是十六进制的值,可以使用 toString方法转换一下。

let s = ‘??a‘;

s.codePointAt(0).toString(16) // "20bb7"
s.codePointAt(2).toString(16) // "61"

以上代码仍然存在问题:codePointAt方法的参数仍然是不正确的。【a在字符串的位置是1, 但是传参却是2】

解决方法: 使用for…of 循环,因为它可以正确识别32位的 UTF-16字符。

let s = ‘??a‘;
for (let i of s) {
   console.log( i.codePointAt(0).toString(16) );
}
// "20bb7"
// "61"

codePointAt 方法 是测试一个字符由 2个字节 还是 4个字节 组成的最简单的方法。

function is32Bit( c ) {
   return c.codePiontAt(0) > 0xFFFF;
}is32Bit("??"); // true

is32Bit("a"); // true

3、String.fromCodePoint()

ES5 的缺陷:

String.fromCharCode 用于从码点返回对应的字符,但是不能识别大于Unicode编码 0xFFFF 的字符(32位的UTF-16字符)

String.fromCharCode(0x20BB7)
// "?"

上面代码 0x20BB7发生溢出最高位两位被舍弃,最后返回码点U+0BB7对应的字符,而不是码点U+20BB7对应的字符。

ES6的改进:

String.fromCodePoint 方法,可以识别大于0xFFFF 的码点;作用上正好与 codePointAt 相反

String.fromCodePoint(0x20BB7)
// "??"
String.fromCodePoint(0x78, 0x1f680, 0x79) === ‘x\uD83D\uDE80y‘
// true

方法中有多个参数,则它们会被合并成一个字符串返回。

注意: fromCodePoint 方法定义在 String对象上, 而codePointAt 方法定义在字符串的实例对象上。

原文地址:https://www.cnblogs.com/james23dong/p/8561056.html

时间: 03-13

ES6标准入门 第四章:字符串的扩展的相关文章

《ECMAScript 6 入门- 第三章 字符串的扩展》 —— 摘抄

1. codePointAT方法 JavaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节.对于那些需要 4个字节储存的字符(Unicode编号大于0xFFFF的字符),JavaScript会认为它们是两个字符.ES6提供了codePointAt方 法,能够正确处理4个字节储存的字符,返回一个字符的Unicode编号. codePointAt方法是测试一个字符由两个字节还是由四个字节组成的最简单方法. function is32Bit(c) { return c.codeP

《ECMAScript 6 入门- 第四章 数值的扩展》 —— 摘抄

1. 二进制和八进制表示法 ES6提供了二进制和八进制数值的新的写法,分别用前缀0b和0o表示. 0b111110111 === 503 // true 0o767 === 503 // true 八进制用0o前缀表示的方法,将要取代已经在ES5中被逐步淘汰的加前缀0的写法. 2. Number.isFinite(), Number.isNaN() ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法,用来检查Infinite和NaN这两个

《ES6标准入门》29~48Page 字符串拓展 正则拓展

1.字符串的拓展 ES3允许使用类似\u0061这样的形式来表示字符,其中的数字是Unicode-8编码. 但如果超出\uffff的字符,必须使用双字节的形式表达,例如 \uD842\uDFB7. 在ES6中,可以用\u{20BB7}这种形式表示,其中数字是Unicode-16编码. 对于需要Unicode-16编码存储的字符,ES认为有2个字符.此时使用String.codePoinAt()方法,可以准确的识别字符串中的字符,如果需要遍历,则需要使用for...of循环. 与此相对,Strin

【学习笔记】ES6标准入门

这里简要记录一下对自己感触比较深的几个知识点,将核心的应用投放于实际的项目之中,提供代码的可维护性. 一.let和const { // let声明的变量只在let命令所在的代码块内有效 let a = 1; var b = 2; } console.log(a); // 报错: ReferenceError: a is not defined console.log(b); // for循环的技术器就很适合let命令 for (let i = 0; i < 3; i++) { console.l

第四章.字符串和字符

String 是一个有序的字符集合,例如 "hello, world", "albatross".Swift 字符串通过 String 类型来表示,也可以表示为 Character 类型值的集合. 字符串字面量 字符串字面量可以用于为常量和变量提供初始值. let someString = "Some string literal value" 注意:someString 常量通过字符串字面量进行初始化,Swift 因此推断其为 String 类

《es6标准入门》chapter11中关于Proxy的一个错误例子的纠正

在原书第二版的p120,这里有一个使用Proxy实现管道化调用的例子,想法很好,但是代码有问题,下面是更正之后的代码. 由于我是在node环境下运行,所以我把几个全局函数定义到global内了,如果是在浏览器下测试,则可以保留原有这部分内容. var pipe=(function(){ var pipe; return function(value){ pipe=[]; return new Proxy({}, { get(target, fnName, receiver){ console.l

Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串

第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service method) 4.4 String类型 String类型不是基本类型,而是引用类型(reference type).

第四章--调试器及相关工具入门

在写这章之前,我看了一下看雪以往的教程.本来想参考一下,可忽然发现,写这样的一章,是一件非常愚蠢的事情,因为我觉的关于这些工具的使用教程.看雪教程中已经写的够详细的了,我并不认为你会看不懂.所以我不想做浪费时间的人,本章就此搁浅. 推荐看<Crack Tutorial 2001>,推荐看<看雪论坛精华一.二.三.四>,推荐看<加密与解密--软件保护技术及完全解决方案>,推荐看一切与之有关的教程. 本章补遗: 要想上路,你最少应该熟练掌握以下工具: SoftICE:目前公

ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一个全面的了解,接下来在本章中,将通过一个案例来熟悉ArcGIS for Desktop的使用,从解决问题的过程中,逐渐适应ArcGIS桌面的界面和操作方式. 本章的练习数据是一个住宅小区的简单平面示意图,需要在已有的基础上把楼房的轮廓补充完整,并加以整饰,完成一幅地图. 1.1 打开地图文档并浏览

HTML与CSS入门——第十四章  使用边距、填充、对齐和浮动

知识点: 1.在元素周围添加边距的方法 2.在元素中添加填充的方法 3.对齐的方法 4.float属性的使用 这里提到了CSS禅意花园,这块有时间可以玩玩~ margin和padding:用于添加元素周围的间距 14.1 使用边距 margin是边距 参数可以有[1~4]4种类型 14.2 填充元素 padding用于填充border与内容之间的空间 参数与margin一致 14.3 保持对齐 align,对齐: 有text-align,vertical-align 使用值根据自己的需求再自行研