Что означает этот экземпляр сообщения об ошибке? - PullRequest
17 голосов
/ 16 мая 2011

Я играл с instanceof в Chrome, но получил сообщение об ошибке. Я думаю Я знаю, почему (вы должны указать функцию после ключевого слова instanceof, являющегося конструктором, с которым был создан объект), но в сообщении об ошибке, похоже, говорится что-то еще:

[1,2,3] instanceof Array
// true

[1,2,3] instanceof []
// TypeError: Expecting a function in instanceof check, but got 1,2,3

Значит ли это, что я должен заменить [1,2,3] на функцию? Я бы подумал, что [1,2,3] является правильным и что [] является проблемой и должен быть заменен функцией, но похоже, что сообщение об ошибке говорит об обратном.

Может кто-нибудь объяснить, как я неправильно интерпретирую сообщение об ошибке?

1 Ответ

25 голосов
/ 16 мая 2011

Объекты являются экземплярами функции конструктора, поэтому проверка состоит в том, чтобы увидеть, является ли левая рука экземпляром права, поэтому правая часть должна быть функцией (и это должен быть конструктор, который создалвозвращаемый объект true).

[1,2,3] instanceof [].constructor;  // true

Таким образом, чтобы ответить на вопрос более прямо, ваше первоначальное понимание правильное, и сообщение об ошибке кажется вводящим в заблуждение (в любом случае, мне).

Из спецификации: http://ecma262 -5.com / ELS5_HTML.htm # Section_11.8.6

1.8.6 Оператор instanceof

Производственный экземпляр RelationalExpression: RelationalExpression экземпляра ShiftExpression оценивается следующим образом:

  • Пусть lref будет результатом вычисления RelationalExpression.
  • Пусть lval будет GetValue (lref).
  • Пусть rref будет результатом вычисления ShiftExpression.
  • Пусть rval будет GetValue (rref).
  • Если Type (rval) не является Object, выдается исключение TypeError.
  • Если rval неиметь внутренний метод [[HasInstance]], генерировать исключение TypeError.
  • Возвращать результат вызова внутреннего метода [[HasInstance]] для rval с аргументом lval.

и http://ecma262 -5.com / ELS5_HTML.htm # Section_15.3.5

15.3.5 Свойства экземпляров функций

В дополнение к обязательным внутренним свойствам каждый экземпляр функции имеет внутреннее свойство [[Call]] и в большинстве случаев использует другую версию внутреннего свойства [[Get]]. В зависимости от того, как они созданы (см. 8.6.2, 13.2, 15 и 15.3.4.5), экземпляры функций могут иметь внутреннее свойство [[HasInstance]] , внутреннее свойство [[Scope]],внутреннее свойство [[Construct]], внутреннее свойство [[FormalParameters]], внутреннее свойство [[Code]], внутреннее свойство [[TargetFunction]], внутреннее свойство [[BoundThis]] и [[BoundArgs]] внутренняя собственность.

Так что требуется TypeError, если правая рука не имеет внутреннего свойства [[HasInstance]], но не указывает формулировку.

Firefox 4 дает мне многоболее заметное сообщение об ошибке:

[1,2,3] instanceof [];

// TypeError: invalid 'instanceof' operand []
...