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/