Определение объекта JavaScript в консоли - PullRequest
6 голосов
/ 31 января 2012

Когда я печатаю простые объекты в Chrome JavaScript Console, я получаю следующий вывод:

>true
true
>1/3
0.3333333333333333

и т. Д.

Но при вводе объектов возникает синтаксическая ошибка:

>{ a: 1, b: 2 }
SyntaxError: Unexpected token :
arguments: Array[1]
0: ":"
length: 1
__proto__: Array[0]
get message: function getter() { [native code] }
get stack: function getter() { [native code] }
set message: function setter() { [native code] }
set stack: function setter() { [native code] }
type: "unexpected_token"
__proto__: Error

Хотя я точно знаю, что это выражение можно было бы правильно использовать при инициализации объекта, потому что:

>obj = { a: 1, b: 2 }
Object
a: 1
b: 2
__proto__: Object

Может быть, это глупый вопрос, но я действительно хочу знать причину, почему это происходит?

Ответы [ 6 ]

8 голосов
/ 31 января 2012

Поскольку ваш оператор оценивается как блок , а не объявление литерала объекта.

Обратите внимание, что ExpressionStatement не может начинаться с открывающего фигурногоскобка, потому что это может сделать его неоднозначным с блоком.Кроме того, ExpressionStatement не может начинаться с ключевого слова function, потому что это может сделать его неоднозначным с FunctionDeclaration.

Чтобы сделать его оценочным как выражение , оно должно быть правильнымсторона задания, заключенная в скобки или предшествующая оператору.(!{a:1,b:2})

7 голосов
/ 31 января 2012
 { a: 1, b: 2 }

- это кодовый блок с двумя ошибочно помеченными переменными.

Чтобы создать объект, заключите его в круглые скобки, чтобы фигурные скобки интерпретировались как литералы объекта:

({ a: 1, b: 2 })
4 голосов
/ 31 января 2012

Это потому, что открытие { без контекста интерпретируется как начало блока. Вы можете использовать скобки:

({ a: 1, b: 2 })

Как бы то ни было, это всего лишь блок выполнения - как можно найти после if или for. Таким образом, вы можете ввести:

{alert("Hello!");}

Подробнее об этом. Блокирует также и возвращаемые значения, что одновременно и удивительно, и разочаровывает.

2 голосов
/ 31 января 2012

Поскольку ваш оператор оценивается как блок, а не как объектное литеральное объявление.

Правда, Джош

Если вы хотите, чтобы он оценивался как объект, просто напишите:

> ({a : 1, b : 2})
Object
a: 1
b: 2
__proto__: Object
2 голосов
/ 31 января 2012

Поскольку { a: 1, b: 2 } не является допустимым выражением для выполнения. JavaScript выглядит как блок кода, поскольку он начинается и заканчивается фигурными скобками.

Если вы попробуете ({ a: 1, b: 2 }), это сработает.

1 голос
/ 31 января 2012

Попробуйте вместо этого:

({ "a" : 1, "b" : 2 })
...