当前位置: 首页 > 科技观察

JavaScript字符串小知识

时间:2023-03-12 13:13:33 科技观察

说到字符串,我们再熟悉不过了。接触编程的第一个经典任务就是输出一个字符串:Hello,world。但是你知道JavaScript字符串在计算机中是如何表示的吗?最简单直观但不太准确的理解是,字符串就是英文字母、数字、标点符号等字符的序列。例如,下面的字符串由5个字母和一个感叹号组成:constmessage='Hello!';同时也可以看出字符串的字符个数为6:constmessage='Hello!';message.length;//=>6如果字符串是由这些可见字符组成的(即127个ASCII字符),这样理解是没有问题的。但是,一旦遇到不常见的符号,比如一些emoji字符😀、😁、😈,可能会得到意想不到的结果:constsmile='😀';smile.length;/是/=>2奇怪?只有一个字符,长度怎么会是2呢?这是因为JavaScript字符串实际上是由代码单元组成的,而不是可见字符的序列。ECMA262规范对JavaScript字符串的描述如下:String类型是零个或多个16位无符号整数值的有序序列的集合。字符串类型通常用于表示正在运行的ECMAScript程序中的文本数据,在这种情况下,字符串中的每个元素都被视为UTF-16代码单元值。简单地说,一个JavaScript字符串只是一个UTF-16编码单元的序列,一个数字串。一个代码单元是0x0000到0xFFFF之间的一个数字,代码单元与字符之间存在对应关系。例如代码单元0x0048对应实际字符H:constletter='\u0048';letter==='H'//=>true如果整个字符串'Hello!'由代码单元表示,是这样的:constmessage='\u0048\u0065\u006C\u006C\u006F\u0021';message==='Hello!';//=>truemessage.length;//=>6可以看到这个字符串有6个编码单元,每个编码单元对应一个字符。BasicMultilingualPlane(BMP)中的任何字符都可以用UTF-16代码单元表示。但是超出这个范围的字符需要2个UTF-16编码单元来表示。比如上面提到的笑脸符号编码为\uD83D\uDE00:constsmile='\uD83D\uDE00';smile==='😀';//=>truesmile.length;//=>2这两个Code单元成对存在,用来表示0xFFFF以外的字符。不能拆解,否则会变成无法识别的乱码。另外,这里的.length是2,说明这个属性其实是字符串编码单元的个数,而不是字符个数。注意需要判断字符个数时,根据.length得到的结果是不准确的。如何解决?你可以使用这个方法:constmessage='Hello!';constsmile='😀';[...message].length;//=>6[...smile].length;//=>1如果你觉得这篇关于JavaScript字符串的小知识对你有用,欢迎分享给你的朋友!