2009-12-08 2 views
0
eval('({"suc":true})') 

выше неправильно, должно быть:Javascript Eval

eval('{"suc":true}') 

Почему?

+3

Разве это не наоборот? –

ответ

0
eval('({"suc":true})') 

Это не так, потому что это будет правильно оценено.

4

При попытке оценить интерпретатор видит фигурные скобки и думает, что это начало блока. Округление в скобках делает его выражением и правильно инициализирует объект.

1

Я не знаю, чего вы хотите достичь, но из ваших примеров сначала правильно, а вторая - синтаксическая ошибка.

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 ...).

+0

любая идея, в то время как массив не требует скобок: var arr = eval ('[true, false']); –

+0

@lzprgmr См. Мой обновленный ответ. – MBO