2015-01-13 1 views
5

Я удивлен, что следующий код, если вход в Chrome расслоение плотной консоли:Uncaught SyntaxError: Неожиданный маркер InstanceOf (с Chrome Javascript консоли)

{} instanceof Object 

результаты в этом сообщении об ошибке:

Uncaught SyntaxError: Unexpected token instanceof

Может кто-нибудь, пожалуйста, скажите мне, почему это так и как это исправить?

ответ

10

Грамматика для InstanceOf является:

RelationalExpression instanceof ShiftExpression 

за ECMA-262 §11.8.

В начале инструкции пунктуатор { рассматривается как начало блока, поэтому следующий } закрывает блок и завершает утверждение.

Следующая instanceof оператор является началом следующего оператора, но она не может быть в начале, потому что она должна предшествовать ВыраженияОтношения, поэтому анализатор получает сюрприз.

Вам нужно заставить {} рассматриваться как объект буквально, помещая что-то еще в начале инструкции, например.

({}) instanceof Object 
+1

Это отличное объяснение чувака (+1). Благодаря ! – Christos

1

Если вы попробуете это:

var a = {} 
a instanceof Object 

выходы true, который является ожидаемым выходом.

Однако в вашем случае

{} instanceof Object 

Вышесказанное не выдает истинный.

Последний не так же, как первый. В первом случае мы создаем литерал объекта, а во втором - нет. Следовательно, вы получаете эту ошибку.

+0

Умм ... Но почему это не работает у оператора. Почему он даже не признает оператора? – balteo

+0

@balteo '{}' Это не оператор в JavaScript. Мы можем разместить внутри '{}' пары ключей/значений в порядке создания объекта. Это самый короткий способ создания объекта в JavaScript. Это не похоже на оператор вызова '()', который при добавлении после функционального выражения будет выполняться это выражение или как '+' оператор и так далее. – Christos

+0

Я имел в виду, почему он отказывается от оператора 'instanceof'? – balteo

3

{}, в этом контексте, является блок, не литерал объекта.

Вам нужно изменить контекст (например, обернув его в ( и )), чтобы сделать его объектным литералом.

({}) instanceof Object; 
+0

Спасибо Квентин: он работает. Но можете ли вы объяснить, почему оператор не распознается? Почему это сообщение об ошибке? – balteo

+1

@balteo - Потому что вы кладете его после блока кода вместо объекта. – Quentin

Смежные вопросы