JavaScript: {} == ложью является SyntaxError?

Для последовательных обещаний использование простого цикла в функции async очень просто и понятно:

let userIDs = [1, 2, 3];

async function uploadIDS(ids) {
  for (let id of ids) {
    let res = await upload(id)
    console.log("Success:", res)
  }
}

const upload = (example) => {
  console.log('uploading...');
  return new Promise(function(resolve, reject) {
    resolve(example)
  });
};

uploadIDS(userIDs)

16
задан glmxndr 5 January 2012 в 07:38
поделиться

3 ответа

{

в начале оператора сигнализирует о «блоке оператора» (см. ECMA-262-3 раздел 12.1), который содержит список операторов.

}

немедленно завершает блок операторов без операторов. Все в порядке. Но теперь парсер ищет следующее утверждение:

==false

А? Это не утверждение; синтаксическая ошибка.

Для чего нужны блоки операторов? Ну, вы пишете блок операторов каждый раз, когда говорите:

if (something) {
    ...
}

JavaScript определяет эти операторы управления потоком следующим образом:

if "(" <expression> ")" <statement> [else <statement>]

т.е. в единой форме заявления без скобок. Затем он позволяет вам использовать блок операторов везде, где вы можете использовать один оператор, что означает, что вы можете иметь операторы if-braces-many-операторов. Но это также означает, что вы можете иметь сам блок операторов без связанного с ним оператора управления потоком.

1118 Это абсолютно бесполезно! Вы могли бы поддаться искушению думать, что это дает вам сокрытие информации, но нет:

var a= 1;
{
    var a= 2;
}
alert(a);

... приводит к 2, потому что блоки операторов сами по себе не создают новую область видимости.

JavaScript определяет управление потоком и блоки операторов таким образом, потому что C (и другие языки, производные от него) сделали. Эти языки не заставили {} выполнять двойную функцию в качестве литерального выражения Object, поэтому у них не было двусмысленности, которая делает эту очередную ошибку JS.

Даже этот wannabe-литерал:

{
   a: 1
}

является допустимым блоком операторов, поскольку ‘:’ используется для обозначения метки в операторе. (а 1 - бесполезное выражение-выражение с пропущенной точкой с запятой.) Метки - это еще одна особенность, унаследованная от C, которая редко используется в JavaScript. Они не совсем бессмысленны, как блоки, но они редко нужны и часто рассматриваются с плохим вкусом.

(Литерал с двумя свойствами вызовет синтаксическую ошибку, поскольку литералы объектов используют разделители запятых, но помеченные операторы должны быть разделены точками с запятой.)

Это не единственное место где свободный синтаксис JavaScript может сбить вас с толку, сделав какое-то другое утверждение того, что вы считаете выражением.

41
ответ дан 30 November 2019 в 15:35
поделиться

Проще говоря, {}==false компилируется компилятором Js в {};==false, так что это синтаксическая ошибка. Вы должны написать ({})==false, и он вернет false.

0
ответ дан 30 November 2019 в 15:35
поделиться

Хорошо, я изучил спецификацию ECMAScript (PDF) и у меня есть объяснение, в котором обсуждается грамматика BNF .

] Исходные тексты ECMAScript анализируются, начиная с главного символа, называемого Program :

Program:
    SourceElements

SourceElements ' не может начинаться с открывающейся фигурной скоба, потому что это может сделать это неоднозначно с Блоком. Также ExpressionStatement не может начинаться с ключевое слово функции, потому что это может сделать это двусмысленным с FunctionDeclaration.

Таким образом, мы можем иметь выражение в начале программы , но оно не должно начинаться с открывающей фигурной скобки ( {). Вот почему работает следующее:

  • ({} == false);
  • alert ({} == false);
  • ! {} == false;
11
ответ дан 30 November 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: