Почему оценке JavaScript нужны круглые скобки к оценке данные JSON?

Просто для полноты в Java 8 есть longAdder, который дает некоторые преимущества по сравнению с AtomicInteger ( http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic /LongAdder.html)

final Map result = new HashMap<>();
result.get(WhatEver).increment();

34
задан Salman A 16 December 2014 в 11:26
поделиться

6 ответов

Заключение круглых скобок вокруг data_from_the_wire фактически эквивалентно

stuff = eval('return ' + data_from_the_wire + ';');

. Если бы вы выполняли eval без круглых скобок, тогда код был бы оценен, и если бы они у вас были внутри него именованные функции будут определены, но не возвращены.

Возьмем в качестве примера возможность вызова функции в том виде, в котором она была создана:

(function() { alert('whoot'); })()

Будет вызывать функцию, которая только что была определена. Следующее, однако, не работает:

function() { alert('whoot'); }()

Итак, мы видим, что скобки фактически превращают тогда код в выражение, которое возвращает, а не просто код для выполнения.

39
ответ дан 27 November 2019 в 16:00
поделиться

eval принимает последовательность операторов Javascript. Парсер Javascript интерпретирует токен '{', встречающийся в операторе, как начало блока, а не начало литерала объекта.

Когда вы заключаете свой литерал в круглые скобки следующим образом: ({data_from_the_wire}) вы переключаете парсер Javascript в режим синтаксического анализа выражений. Токен '{' внутри выражения означает начало объявления литерала объекта, а не блок, и поэтому Javascript принимает его как литерал объекта.

63
ответ дан 27 November 2019 в 16:00
поделиться

Это происходит потому, что без круглых скобок JavaScript пытается интерпретировать {"текст": ... как метка и терпит неудачу. Попробуйте это в консоли, и вы получите ошибку «Недействительный ярлык».

2
ответ дан 27 November 2019 в 16:00
поделиться

Я не уверен в причине но я анализирую JSON, используя класс JSON из json.org . Это намного безопаснее, чем использовать eval.

11
ответ дан 27 November 2019 в 16:00
поделиться

Фактически, это зависит от значения data_from_the_wire . В большинстве случаев ваш синтаксис в порядке, но строка, начинающаяся с {, анализируется как метка, а ваша - недействительна. Если вы заключите его в круглые скобки, это предотвратит неправильную интерпретацию вашего выражения парсером.

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

Одно из решений - всегда оценивать инструкции, а не выражения. Вы можете написать

eval('var stuff = {"text": "hello"}');
1
ответ дан 27 November 2019 в 16:00
поделиться

Я не знаю, и меня действительно интересует ответ на этот вопрос, но я предполагаю, что без скобок данные в data_from_the_wire будут интерпретированы как закрытие. Возможно, скобки приводят к оценке, и ассоциативный массив «возвращается».

Это тот тип предположений, который приводит к отрицательным голосам =).

РЕДАКТИРОВАТЬ

Дуглас Крокфорд упоминает синтаксическую неоднозначность в своем JSON , но это мне не особо помогло.

-2
ответ дан 27 November 2019 в 16:00
поделиться
Другие вопросы по тегам:

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