Когда я типа простых объектов в 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
Может быть, это глупый вопрос, но я действительно хочу знать, почему это происходит?
Try '({а: 1, Ь: 2}) '. –
Я знаю достаточно, чтобы сказать вам, что это связано с тем, что JavaScript очень специфичен в отношении правильного выражения, а что нет. Например, 'function foo() {}' является _Function Declaration_, но '(function foo() {})' является выражением _Function Expression_ из-за синтаксических правил, и они имеют разные функциональные последствия. Я не знаю спецификации достаточно, чтобы указать вам точную формулировку, которая запрещает '{}' как выражение, но допускает '({})' (попробуйте!), Но я знаю, что безумство spec достаточно, чтобы сказать вам, что этот ответ, скорее всего, заставит вас сказать: «Да, хорошо». – Phrogz
Лучший ответ, который вы, скорее всего, получите, похож на _reason_, что '+ []' равно '0', но' + [] + [] 'равно строке' '0" '. Причина в том, что «потому что это то, о чем спекулянт говорит», без какого-либо большого понимания того, почему авторы спекуляций решили принять это решение. – Phrogz