Думать как JavaScript
Vlad Poe
4933

В голове у автора оригинальной статьи действительно каша.

Если внимательно почитать спеку (12.4.4 Postfix Increment Operator) и сравнить её с присваиванием (12.15 Assignment Operators Syntax), то мы обнаружим жуткое сходство за исключением операции приведения к числу.

Но автор настаивает на том, что выражение [] = [] + 1 валидно, ибо слева у нас деструктуризация. Но деструктуризация это вообще отдельная часть спеки, которая является не очень согласованной с остальной спекой. Строго говоря, трактовка [] слева от оператора присваивания является двусмысленной, которую разруливают в спеке в пользу деструктуризации. Ближайшим аналогом для конструкции []++ должна быть конструкция вида ([]) = [] + 1. Но она не валидна по другим причинам.

Вообще если у вас есть сомнения в том, как будет воспринят код нужно смотреть как он распарсится. Есть например https://astexplorer.net. Кстати, такие примеры показывают разное AST на разных парсерах. А это значит, что парсеры не очень уважают мнение спеки в вопросах шизоидного кода.

А вообще в практически большей части си-подобных языков первая строка будет валидной, а вторая невалидной. С поправкой на синтаксис создания массива.

P.S: кроме того, это большое запутывание — писать Reference без пояснения, что оно отличается в спеке по сравнению с общепринятым. Ибо [] принадлежит reference type, но не к reference в терминах синтаксической конструкции. Обычно такую хрень называют lref

Like what you read? Give Viktor Love a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.