使用ES6扩展运算符处理带有表情符号的字符串数组时出现“空洞”问题。

13

为什么我使用扩展运算符(spread(...) operator)来分割包含表情符号的字符串时,结果数组中会出现“空洞”?

例如: [...''] // -> ["", hole]

此外,表情符号越多,“空洞”也就越多: [...''] // -> ["", "", hole, hole]

来自Chrome v71.0.3578.98的屏幕截图:


就我所知,我在Firefox 64和Safari 12上尝试复现此问题,但未能成功。这似乎是Chrome特有的行为。 - enriquecastl
无法在Chrome版本70.0.3538.110(官方构建)(64位)上复制。 - phuzi
2
最近版本的Chrome似乎存在问题。由于JS处理Unicode的方式,''被认为具有长度2。然而,ES6的Array.from()和展开运算符应该正确处理这个问题,就像其他浏览器和之前版本的Chrome一样。 - Vakaren
1
是的,这是V8中的一个错误。我们已经在一段时间前修复了它,并且修复将很快传播到稳定版Chrome中。 - Mathias Bynens
1
相关的V8错误是[914409](https://bugs.chromium.org/p/chromium/issues/detail?id=914409)。 - Mathias Bynens
显示剩余2条评论
2个回答

6
当然这是一个bug。
作为解决办法,Array.from()可以完全替代它而且没有bug。
> s="\uD83C\uDF1F\u5FCD\u8005\u306E\u653B\u6483\uD83C\uDF1F"
> [...s]
(9) ["", "忍", "者", "の", "攻", "撃", "", hole, hole]
> Array.from(s)
(7) ["", "忍", "者", "の", "攻", "撃", ""]

看起来这个问题已经在Chrome 72中得到了解决,但您可以在Chromium上开一个bug,并要求将其合并到71版。
修复和测试用例在这里:https://crrev.com/902d21dd661033427b56d5f93c12b12339bf55ab (我认为“hole”是V8告诉您一些本地代码出错了,并未能正确初始化数组,与常规JavaScript产生的“empty”不同。)
没错,V8肯定把自己搞糊涂了:
> a=[...'\u{1f4a9}']
(2) ["", hole]
> hole=a[1]
undefined
> hole
VM384:1 Uncaught ReferenceError: hole is not defined

终于好了...刚刚更新了Chrome,问题消失了...谢谢! - PAEz

0

现在没问题了

[...'']
// [""]

[...'']
// (2) ["", ""]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接