2012-01-31 2 views
6

Когда я типа простых объектов в Chrome JavaScript консоли, я получаю выход, как это:Определение объекта JavaScript в консоли

>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 

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

+4

Try '({а: 1, Ь: 2}) '. –

+3

Я знаю достаточно, чтобы сказать вам, что это связано с тем, что JavaScript очень специфичен в отношении правильного выражения, а что нет. Например, 'function foo() {}' является _Function Declaration_, но '(function foo() {})' является выражением _Function Expression_ из-за синтаксических правил, и они имеют разные функциональные последствия. Я не знаю спецификации достаточно, чтобы указать вам точную формулировку, которая запрещает '{}' как выражение, но допускает '({})' (попробуйте!), Но я знаю, что безумство spec достаточно, чтобы сказать вам, что этот ответ, скорее всего, заставит вас сказать: «Да, хорошо». – Phrogz

+0

Лучший ответ, который вы, скорее всего, получите, похож на _reason_, что '+ []' равно '0', но' + [] + [] 'равно строке' '0" '. Причина в том, что «потому что это то, о чем спекулянт говорит», без какого-либо большого понимания того, почему авторы спекуляций решили принять это решение. – Phrogz

ответ

8

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

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

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

+0

'! {A: 1}' на самом деле не помогает, когда вы хотите получить значение;) – Ryan

+1

@minitech: Нет, но он выражение силы выражения. В качестве практического приложения вы можете использовать это свойство, чтобы вычеркнуть байт из автономных функций: '! Function() {...}();' вместо традиционного '(function() {...})(); ' – josh3736

2

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

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

7
{ a: 1, b: 2 } 

является блок кода, с двумя неправильно labelled переменными.

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

({ a: 1, b: 2 }) 
+0

. Интересно, что работают помеченные переменные. Это запятая, это проблема, и если вы измените ее на точку с запятой, она тоже будет работать. Странный. Вы также можете вставлять URL-адреса в JavaScript ... – Ryan

4

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

({ a: 1, b: 2 }) 

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

{alert("Hello!");} 

Here's more about that. Блоки сортировки возвращаемых значений тоже, что и удивительным, и разочарование.

1

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

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

Потому что ваше утверждение оценивается как блок, не является объектом буквального декларации.

Правда подшучивать

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

> ({a : 1, b : 2}) 
Object 
a: 1 
b: 2 
__proto__: Object 
Смежные вопросы