ответ
eval('({"suc":true})')
Это не так, потому что это будет правильно оценено.
При попытке оценить интерпретатор видит фигурные скобки и думает, что это начало блока. Округление в скобках делает его выражением и правильно инициализирует объект.
Я не знаю, чего вы хотите достичь, но из ваших примеров сначала правильно, а вторая - синтаксическая ошибка.
eval('({"suc":true})')
такая же, как и ({"suc":true})
JavaScript интерпретирует его как:
Так она возвращает новый объект с suc
собственности и соответствующим значением true
.
eval('{"suc":true}')
такая же, как {"suc":true}
и интерпретируется как:
{ // <- this is block begining
"suc": // <- this is label, but incorrect, as it is given as string, not literally
true // <- this is expression
}
Если изменить "suc"
к suc
(без скобок), то он будет работать, но это не то же самое, как в первом примере.
UPDATE:
Как почему массив не нуждается в скобках: нет другой структуры в Javasript, который будет начинаться с [
символа, отличного от массива.
Там не будет никаких проблем с {
, если она будет отображаться в контексте, который ожидает, что стоимость, как это:
eval('var a = {"succ": true}')
Это же в исходном коде (так что не только в Eval блоке): вы не можете создайте объект с помощью короткой нотации ({ .. }
), не присваивая его какой-либо переменной или передавая ее как значение (для функции, return statement ...).
любая идея, в то время как массив не требует скобок: var arr = eval ('[true, false']); –
@lzprgmr См. Мой обновленный ответ. – MBO
Вы пытались использовать JSON.parse('{"suc":true}))
?
Разве это не наоборот? –