字符的表示方式 上

483 阅读3分钟

这是我参与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);

截图_20213317123323.png

\[8进制ASCII码]

大家知道 ASCII 码能表示基本的标点符号,数字(0-9),英文(a-z, A-Z),满足米国的基本使用需求。
ASCII 码止共定义了128个字符,其中33个字符无法显示。

二进制,0010 0000 ~ 0111 1110 (32-126)是可以显示的 ,基本都能使用键盘打出来, 具体参见对照表: ASCII编码对照表

我们可以 \[8进制ASCII码]

  1. 比如字符 a 为 97, 可以使用charCodeAt获取,
'a'.charCodeAt(0) // 97
  1. 转为8进制为97..toString(8) = 141
  2. \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);

截图_20214317124332.png 如下可以正常实现:

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

小结

今天你收获了吗?

引用

ASCII编码对照表