Определение объекта JavaScript в консоли
Когда я печатаю простые объекты в 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 ответов
Потому что ваш оператор оценивается как блок, а не как объектное литеральное объявление.
Обратите внимание, что ExpressionStatement не может начинаться с открывающей фигурной скобки, потому что это может сделать его неоднозначным с блоком. Кроме того, ExpressionStatement не может начинаться с ключевого слова function, потому что это может сделать его неоднозначным с FunctionDeclaration.
Чтобы сделать его оценочным как выражение, оно должно быть правой частью присваивания, заключенное в скобки или предшествующее оператору. (!{a:1,b:2}
)
{ a: 1, b: 2 }
кодовый блок с двумя ошибочно помеченными переменными
Чтобы создать объект, окружите блок кода скобками, чтобы фигурные скобки интерпретировались как литералы объекта:
({ a: 1, b: 2 })
Это потому что открытие {
без контекста интерпретируется как начало блока. Вы можете использовать скобки:
({ a: 1, b: 2 })
Тем не менее, это всего лишь блок выполнения - как можно найти после if
или же for
, Таким образом, вы можете ввести:
{alert("Hello!");}
Вот еще об этом. Блокирует также и возвращаемые значения, что является одновременно и удивительным, и разочаровывающим.
Потому что ваш оператор оценивается как блок, а не как объектное литеральное объявление.
Правда джош
Если вы хотите, чтобы он оценивался как объект, просто напишите:
> ({a : 1, b : 2})
Object
a: 1
b: 2
__proto__: Object
Так как { a: 1, b: 2 }
не является допустимым выражением для выполнения. JavaScript выглядит как блок кода, поскольку он начинается и заканчивается фигурными скобками.
Если вы попытаетесь ({ a: 1, b: 2 })
, это будет работать.