"Отверстия" в массиве при использовании оператора растяжения es6 в строке с смайликами

Почему, когда я пытаюсь разбить строку с помощью эмодзи (ов), используя оператор распространения (...), я получаю "дыры" в массиве результатов?

Пример: [...'💪']/ / -> ["💪", hole]

Также больше смайликов создает больше "дыр": [...'💪💪']/ / -> ["💪", "💪", hole, hole]

Скриншот из Chrome v71.0.3578.98:

Ответы

Ответ 1

Конечно, это ошибка.

В качестве обходного пути Array.from() работает идентично, за исключением того, что он не глючит.

> s="\uD83C\uDF1F\u5FCD\u8005\u306E\u653B\u6483\uD83C\uDF1F"
> [...s]
(9) ["🌟", "忍", "者", "の", "攻", "撃", "🌟", hole, hole]
> Array.from(s)
(7) ["🌟", "忍", "者", "の", "攻", "撃", "🌟"]

Похоже, исправление в Chrome 72, но вы можете открыть ошибку в Chromium и попросить объединить ее с 71.

Исправление и контрольный пример находятся здесь: https://crrev.com/902d21dd661033427b56d5f93c12b12339bf55ab

(Я полагаю, что "дыра" в V8 говорит вам, что какой-то нативный код облажался и не смог правильно инициализировать массив, в отличие от "пустого", который может быть создан обычным javascript.)

Да, V8 определенно запутался:

> a=[...'\u{1f4a9}']
(2) ["💩", hole]
> hole=a[1]
undefined
> hole
VM384:1 Uncaught ReferenceError: hole is not defined