这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战。
前言
ECMAScript 6.0 简称ES6 , 是 JavaScript 语言的新一代的标准,于在 2015 年 6 月发布,正式名称就是《ECMAScript 2015 标准》。一般情况,泛指, 5.1版以后的标准,涵盖了 ES2015、ES2016、ES2017、ES2018、ES2019、ES2020、ES2021 等等
我们一起来学习 字符的表示方式吧,你猜猜有几种?
直接字符表示
我们常用的就是这种表示方式,有点很明显啊直接。
var ch = "a";
var ch1 = "人";
var ch2 = "𠄒";
看没啥区别,其实有区别, 字符串是采用UTF-16编码的,UTF-16的编码单元是两个字节。 大于0xFFFF是四个字节,两个编码单元。这个反应到字符的length上。
var ch = "a";
var ch1 = "人";
var ch2 = "𠄒"
ch.length // 1
ch1.length // 1
ch2.length // 2
ch2.codePointAt(0) > 0xFFFF // true
大家知道有个特殊的符号,叫转义符 "\", 当然加上转义符, 一般的字符是可以加上转义符,没啥区别的。
var ch = "\a";
console.log(ch); // a
当然,也有一些特殊字符组合代表特性的含义, 其在输出的时候才能看到效果。
var txt = '我\r\n是\r\n人';
console.log("txt", txt);
\[8进制ASCII码]
大家知道 ASCII 码能表示基本的标点符号,数字(0-9),英文(a-z, A-Z),满足米国的基本使用需求。
ASCII 码止共定义了128个字符,其中33个字符无法显示。
二进制,0010 0000 ~ 0111 1110 (32-126)是可以显示的 ,基本都能使用键盘打出来, 具体参见对照表:
ASCII编码对照表。
我们可以 \[8进制ASCII码],
- 比如字符
a为 97, 可以使用charCodeAt获取,
'a'.charCodeAt(0) // 97
- 转为8进制为
97..toString(8) = 141 \141
console.log('\141') // a
Unicode的码点在0-128和ASCII是完全一致,我们也简称码点吧。
对于码点小于32和大于126的ASCII, 通过\[8进制ASCII码]是不能被正确显示的。
// 37 = 31..toString(8)
'\37' // '\x1F'
// 201 = 129..toString(8)
'\37' // '\0x81'
至于为什么 \37 变为了 \x1F
字符串模板
这个是ES6出现的,姑且也算另外一种字符的表示形式吧。
那你看看下面的代码,结果是会报异常:
var ch = `a`;
var ch1 = `\172`;
console.log(ch);
console.log(ch1);
如下可以正常实现:
var ch = `a`;
var ch1 = `${"\172"}`;
console.log(ch); // a
console.log(ch1); // 2
Uncaught SyntaxError: Octal escape sequences are not allowed in template strings.
这是以字符串模板的限制:javascript模板字符串中不允许使用八进制转义序列?
带标签的模版字面量及转义序列 是有提及的。
怎么解呢, 但是\uxxxx或者\u{xxxxx}格式是可以的,我们下篇见。
// 61, "a".charCodeAt(0).toString(16)
`\u0061` // a
`\u{0061}` // a
小结
今天你收获了吗?