Просто для полноты в 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();
Заключение круглых скобок вокруг data_from_the_wire
фактически эквивалентно
stuff = eval('return ' + data_from_the_wire + ';');
. Если бы вы выполняли eval без круглых скобок, тогда код был бы оценен, и если бы они у вас были внутри него именованные функции будут определены, но не возвращены.
Возьмем в качестве примера возможность вызова функции в том виде, в котором она была создана:
(function() { alert('whoot'); })()
Будет вызывать функцию, которая только что была определена. Следующее, однако, не работает:
function() { alert('whoot'); }()
Итак, мы видим, что скобки фактически превращают тогда код в выражение, которое возвращает, а не просто код для выполнения.
eval
принимает последовательность операторов Javascript. Парсер Javascript
интерпретирует токен '{', встречающийся в операторе, как начало блока, а не начало литерала объекта.
Когда вы заключаете свой литерал в круглые скобки следующим образом: ({data_from_the_wire})
вы переключаете парсер Javascript в режим синтаксического анализа выражений. Токен '{' внутри выражения означает начало объявления литерала объекта, а не блок, и поэтому Javascript принимает его как литерал объекта.
Это происходит потому, что без круглых скобок JavaScript пытается интерпретировать {"текст": ...
как метка и терпит неудачу. Попробуйте это в консоли, и вы получите ошибку «Недействительный ярлык».
Я не уверен в причине но я анализирую JSON, используя класс JSON из json.org . Это намного безопаснее, чем использовать eval.
Фактически, это зависит от значения data_from_the_wire
. В большинстве случаев ваш синтаксис в порядке, но строка, начинающаяся с {
, анализируется как метка, а ваша - недействительна. Если вы заключите его в круглые скобки, это предотвратит неправильную интерпретацию вашего выражения парсером.
На самом деле, это просто проблема синтаксического анализа. Со строками, числами или функциями у вас не возникнет такой проблемы.
Одно из решений - всегда оценивать инструкции, а не выражения. Вы можете написать
eval('var stuff = {"text": "hello"}');
Я не знаю, и меня действительно интересует ответ на этот вопрос, но я предполагаю, что без скобок данные в data_from_the_wire
будут интерпретированы как закрытие. Возможно, скобки приводят к оценке, и ассоциативный массив «возвращается».
Это тот тип предположений, который приводит к отрицательным голосам =).
РЕДАКТИРОВАТЬ
Дуглас Крокфорд упоминает синтаксическую неоднозначность в своем JSON , но это мне не особо помогло.