Что означает двоеточие в этом фрагменте JavaScript (не литерал объекта)?

Приношу извинения за публикацию дублирующего вопроса (я знаю, что здесь есть куча вопросов с похожими названиями), но ни один из уже присутствующих вопросов не подходит для моего случая.

Короче говоря, что здесь делает двоеточие:

<script>
  'use strict';
  foo: 1;

  //whatever else
</script>

Я предполагал, что это синтаксическая ошибка, но это не так. И я думаю, что это не ярлык, поскольку добавление строки break foo; выдает Uncaught SyntaxError: Undefined label 'foo' (хотя документ страница предполагает именно это, что это ярлык).

Я предполагаю, что это недавнее дополнение к синтаксису JavaScript, так как я никогда не слышал о таком использовании двоеточия.


Если кому-то интересно, почему я это спрашиваю, вот мое объяснение: я читал страница документа MDN и пример:

var func = () => { foo: 1 };               
// Calling func() returns undefined!

Это показывает, что фигурные скобки в этом случае рассматриваются как разделители блоков, а не литерал объекта. Поэтому я предположил, что каким-то образом foo: 1 само по себе должно быть синтаксически допустимым. И это действительно так.

Существует вопрос, который должен охватывать каждое использование двоеточия в JavaScript, но он не упоминает об этом, и ни один ответ не делает этого.


person Dmitry Koroliov    schedule 04.10.2017    source источник
comment
Почти уверен, что это этикетка. Я подозреваю, что вы получаете эту ошибку с break foo;, потому что foo - это не цикл, из которого вы можете выйти.   -  person Andy    schedule 04.10.2017
comment
Почему минус? Парень не знает функции стрелок, он пытался понять, задал четкий вопрос и получил четкий ответ.   -  person DanteTheSmith    schedule 04.10.2017


Ответы (1)


Если бы вы читали дальше страницу, на которую вы ссылаетесь, вы бы поняли, почему это было написано именно так.

var func = () => { foo: 1 };

Это попытка вернуть объект из стрелочной функции.

Это не работает по причинам, описанным здесь:

Это связано с тем, что код внутри фигурных скобок ({}) анализируется как последовательность операторов (т. е. foo рассматривается как метка, а не как ключ в литерале объекта). (источник)

Поэтому возвращаемое значение необходимо заключить в круглые скобки:

var func = () => ({foo: 1});

Чтобы на самом деле ответить на ваш вопрос:

Это ярлык.

Вы не можете просто так вырвать foo: 1 из контекста.

person Cerbrus    schedule 04.10.2017
comment
На самом деле я прочитал его дальше, хотя после того, как опубликовал вопрос. Да, наверное, это метка, потому что Firefox ее не набрасывает. Вероятно, это просто какая-то конкретная проблема Chrome. - person Dmitry Koroliov; 04.10.2017
comment
Да, наверное, это ярлык Нет, не наверное. Это это ярлык. ;-) Это не проблема. Это работает, как и ожидалось. - person Cerbrus; 04.10.2017
comment
под проблемой я имел в виду, что Chrome, вероятно, не должен использовать это, если это законный синтаксис - person Dmitry Koroliov; 04.10.2017
comment
Вы имеете в виду, что он выдает строку break foo? - person Cerbrus; 04.10.2017
comment
извините, я был неправ, Firefox выдает это либо SyntaxError: label not found - person Dmitry Koroliov; 04.10.2017
comment
да я это и имел в виду, что выкидывает на break foo строку и вроде нелогично, по крайней мере только само сообщение об ошибке. Если foo: 1 рассматривался как метка, то почему сообщение не найдено или похоже на метку - person Dmitry Koroliov; 04.10.2017
comment
извините, теперь я понял, что оператор break определенно должен искать метку внутри цикла или одного из родительских циклов. Так что посыл тоже вполне логичен - person Dmitry Koroliov; 04.10.2017
comment
Потому что метка указывает на одну цифру 1, что не имеет смысла. Это, с другой стороны, нормально: foo:for(var i = 0; i < 10; i++){break foo} - person Cerbrus; 04.10.2017