博客
关于我
关于 JavaScript 字符串的一个小知识
阅读量:440 次
发布时间:2019-03-06

本文共 1420 字,大约阅读时间需要 4 分钟。

说起字符串,我们再熟悉不过了。接触编程的第一个经典任务就是输出字符串:Hello, world。但是你知道 JavaScript 字符串在计算机里是怎么表示的吗?

最简单直观但不太准确的的理解就是,字符串就是由英文字母、数字和标点符号等这些字符组成的序列。比如下面这个字符串就是由5个字母和一个感叹号组成的:

const message = 'Hello!';

同时也可以看出该字符串的字符数是6:

const message = 'Hello!';message.length; // => 6

如果字符串是由这些可见字符(也就是 127 个 ASCII 字符) 组成的,这样理解没有问题。但是,一旦碰到不常见的符号,比如一些表情字符😀, 😁, 😈,可能会得到意外的结果:

const smile = '😀';smile.length; // => 2

是不是很奇怪?明明只有一个字符,长度怎么会是 2 呢?这是因为,JavaScript 字符串实际上是由编码单元构成的,而不是可见字符序列。

规范里是这么描述 JavaScript 字符串的:

String 类型是由零或多个 16 位无符号整数值组成的有序序列的集合。字符串类型通常用于表示运行中的 ECMAScript 程序中的文本数据,在这种情况下,字符串中的每个元素都被视为 UTF-16 编码单元值。

简单说,JavaScript 字符串就是 UTF-16 编码单元序列,一串数字而已。

一个编码单元就是位于 0x00000xFFFF 之间的一个数字,编码单元与字符之间有个对应关系。例如,编码单元 0x0048 对应了实际的字符 H

const letter = '\u0048';letter === 'H' // => true

如果把一整个字符串'Hello!'用编码单元表示就是这样:

const message = '\u0048\u0065\u006C\u006C\u006F\u0021';message === 'Hello!'; // => truemessage.length;       // => 6

可以看到,这个字符串有6个编码单元,每个编码单元对应一个字符。基本多文种平面 BMP(Basic Multilingual Plane)中的任意一个字符,都可以用一个 UTF-16 编码单元表示。但是,在这个范围以外的字符,就需要 2 个 UTF-16 编码单元来表示了。比如前面提到的笑脸符号,编码是\uD83D\uDE00

const smile = '\uD83D\uDE00';smile === '😀'; // => truesmile.length;  // => 2

这两个编码单元是成对存在的,用于表示超出 0xFFFF 的字符。不能拆开,否则就变成无法识别的乱码了。另外,这里的.length是2,说明这个属性其实是字符串编码单元的个数,而不是字符数。在需要判断字符数量的时候就要注意了,根据.length得到的结果是不准确的。那要怎么解决呢?可以用这种办法:

const message = 'Hello!';const smile = '😀';[...message].length; // => 6[...smile].length;   // => 1

博客园不常更新,更多前端技术干货可前往公众号。

转载地址:http://nzmyz.baihongyu.com/

你可能感兴趣的文章
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>