string 字符串中字符无效_JavaScript中的字符串(string)到底是什么?

通过可见字符建模

把JavaScript中的string当作字符序列来看待是最直观的,虽然这样并不准确。

f27d78cf30eb27537b40525b3628bc68.png

以下代码示例中的字符串由5个字母和一个感叹号组成:

const message = 'Hello!';

如果把string当作是可见的字符序列,那么'Hello!'中的字符数是6:

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

如果string中的字符都是ASCII字符,那么通过可见字符的方式对string建模效果很不错。

但是,如果string中出现了更加复杂的字符,比如,,,这时候会出现意想不到的的问题。

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

怎么会这样呢?

e3d1dd8bb670643dc24cc2fc58b470e4.png

这是因为JavaScript将字符串视为码元(code unit)序列,而不是可见字符序列。

让我们更详细地了解JavaScript中的字符串。

按码元建模

The String type is the set of all ordered sequences of zero or more 16-bit unsigned integer values (“elements”). The String type is generally used to represent textual data in a running ECMAScript program, in which case each element in the String is treated as a UTF-16 code unit value.

简而言之,JavaScript中的string是一个数字序列。如果用UTF-16编码的码元来表示'Hello!'这个字符串:

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

因为具有6个码元,这对应于'Hello!'字符串中可见字符的数量。

基本多文种平面(Basic Multilangual Plane)中的字符使用一个UTF-16码元进行编码,但是非基本多文种平面(non-Basic Multilangual Plane)则使用一对不可分割的码元进行编码。

const smile = '��';smile === ''; // => truesmile.length;  // => 2

该序列��是一个特殊的对,称为代理对(surrogate pair)

字符串迭代器认识代理对。当您调用字符串迭代器时(例如,使用spread运算符)...,它将代理对视为一个长度单位

const message = 'Hello!';const smile = '';[...message].length; // => 6[...smile].length;   // => 1
1818da992712d6f831adee55a633e166.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值