javascript - String JavaScript 中的反斜杠不算长度,为什么?

标签 javascript string

String JavaScript 中的反斜杠不计入长度,并且在打印时与数字一起消失。我试着用谷歌搜索它,不太确定该怎么调用它。这段代码发生了什么?

var b = "world\0";
alert(b.length)                        // 6
console.log( "world\0" );       // world  (we see here only 5 characters!)

为什么会这样?

最佳答案

\0是创建单个字符的转义序列(就像\t创建单个字符[制表符]、\n创建单个换行符等)字符的字符代码为0(与. 9 表示制表符或 10 表示换行符)。所以字符串中确实有六个字符:

w ( U+0077 )
o ( U+006F )
r ( U+0072 )
l ( U+006C )
d ( U+0064 )
\0 ( U+0000 )

在大多数控制台上,您会看到字符 0 是一个小方框或一个带有问号的菱形,但有些可能根本不会显示它(例如 Node.js 的控制台,至少在撰写本文时是这样) .

我应该注意到 \0产生 U+0000 是一个特例。 \1 产生U+0001等。可能有点偏离主题,但如果你想通过字符代码指定一个字符,你有三个选择:

  • 如果字符适合单个 UTF16 代码单元,其值适合两个十六进制数字,您可以使用十六进制转义序列:\xXX其中 XX恰好是两个十六进制数字。

  • 如果字符适合单个 UTF16 代码单元(无论该值是否适合两位数字),您还可以使用 Unicode 代码单元转义序列:\uXXXX其中 XXXX恰好是四个十六进制数字。

  • 如果字符需要两个 UTF16 代码单元(一个“代理项对”),您可以使用两个 Unicode 代码单元转义,或者更新的 (ES2015+) Unicode 代码转义序列: \u{X+}其中 X+是一个或多个十六进制数字,其值为 <= 0x10FFFF (目前Unicode中的最大码位)。

(如果您不熟悉术语“代码单元”和“代码点”,我已经写了 this blog post 关于它和一般的 JavaScript 字符串。)

比如我们可以写英文大写字母A作为\x41 , \u0041 , 或 \u{41}因为它只需要一个 UTF16 代码单元,并且该代码单元的值适合两个十六进制数字。我们可以将拉丁文大写字母 A-with-macron (Ā) 写为 \u0100\u{100}因为它也只需要一个代码单元——但我们不能使用十六进制转义序列 (\xXX),因为代码单元的值不适合两个十六进制数字。表情符号 😉 需要两个代码单元;我们可以通过写出这两个代码单元 (\uD83D\uDE09) 或通过编写单个代码点 (\u{1F609}) 来编写它(我们不能使用 \xXX 来编写它,因为它的每个代码单元都太对于两个十六进制数字来说很大;由于 UTF16 的定义方式,代理对中的所有 UTF16 代码单元都是如此。

实例:

// The letter A
const a1 = "A";
const a2 = "\x41";
const a3 = "\u0041";
const a4 = "\u{41}";
console.log(a1, a2, a3, a1 === a2, a2 === a3, a3 === a4);

// The letter Ā (A-with-macron)
const m1 = "Ā";
const m2 = "\u0100";
const m3 = "\u{100}";
console.log(m1, m2, m3, m1 === m2, m2 === m3);

// The emoji 😉
const e1 = "😉";
const e2 = "\uD83D\uDE09";
const e3 = "\u{1F609}";
console.log(e1, e2, e3, e1 === e2, e2 === e3);

关于javascript - String JavaScript 中的反斜杠不算长度,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48741428/

相关文章:

javascript - 添加 Angular-Gridster 时模块实例化失败

javascript - 使用 Angular 添加事件状态到列表项

c - 解析 C 中的一行

python - 在python中自动添加字符串内的引号

javascript - 模拟鼠标点击下拉菜单

javascript - javascript中的全局变量以获取地理位置

javascript - 使用 .html() 清除以前的随机字符串不起作用

java - 在 map 中存储大量字符串的最有效内存方法是什么?

Java 1.4 String.replaceAll 单引号问题

javascript - jQuery Mobile 显示/隐藏基于选择字段的表单输入