Подтвердить что ты не робот

Почему открытая цитата и скобка для eval ('(' + jsonString + ')') при анализе строки json

Можете ли вы рассказать мне причину этой специфической структуры синтаксиса

 eval('(' + jsonString+ ')')

При анализе текста json. Крокфорд говорит: "Текст должен быть обернут в parens, чтобы избежать отключения двусмысленности в синтаксисе JavaScript". здесь. Что это значит?

Можно ли это избежать?

4b9b3361

Ответ 1

Синтаксическая неоднозначность, к которой относится Крокфорд, заключается в том, что если открытая фигурная скобка не найдена в контексте выражения, она будет распознана как block, а не как начало литерала объекта.

Например:

{"foo": "bar"} // SyntaxError

Дает вам синтаксическую ошибку, потому что она будет интерпретироваться как блок с строковым литералом "foo" и неожиданным использованием токена :.

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

({"foo": "bar"})

Изменить: @el.pescado задает интересный вопрос:

Можете ли вы объяснить, почему eval ('{}') undefined?

ECMAScript описывает внутренний тип для объяснения поведения операторов, который называется Тип спецификации завершения.

Значения типа завершения - это тройки формы (type, value, target), где type может быть normal, break, continue, return или throw.

value может быть любое значение языка или empty, а target любой идентификатор или empty.

Пустой блок (производственный Block : {}) явно возвращает следующее завершение:

Return (normal, empty, empty).

Функция eval после выполнения кода и выхода из вновь созданного контекста выполнения проверяет завершение результата оцениваемого кода, и на шаге 7 мы видим, что undefined явно возвращается, если тип завершения normal, а значение завершения empty:

...

7- Если result.type является нормальным, а его значение завершения пустым, верните значение undefined.

...

Ответ 2

Литерал объекта должен быть заключен в круглые скобки для правильной оценки в контексте eval и других контекстах:

eval('{}'), например, undefined. а eval('(' + '{}' + ')' ) - Объект.

Если вы попробовали это в консоли, например: {"foo":"bar"}, вы выбрали бы недопустимую метку. Оберните его в круглые скобки и он станет действительным выражением.

Ответ 3

@el.pescado, строка после выполнения eval должна быть понятной javascript. если вы назначаете указанную выше строку в varible следующим образом

eval ('var foo1 = { "foo": "bar" }'); foo1.foo вернет бар

Итак, мое предположение таково, что нет такого утверждения, как это начинается с "{" в javascript, он выдает ошибку.