Подтвердить что ты не робот

Что означает этот экземпляр сообщения об ошибке?

Я играл с 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] верен и что [] является проблемой и должен быть заменен функцией, но похоже, что сообщение об ошибке говорит обратное.

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

4b9b3361

Ответ 1

Объекты - это экземпляры функции-конструктора, поэтому проверка заключается в том, чтобы увидеть, является ли левая рука экземпляром права, поэтому право должно быть функцией (и это должен быть конструктор, который построил объект для возврата 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 является результатом оценки выражения Shift.
  • Пусть rval - GetValue (rref).
  • Если Type (rval) не является объектом, выведите исключение 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]], внутреннее свойство [[Область]], внутреннее свойство [[Construct]], внутреннее свойство [[FormalParameters]], внутреннее свойство [[Code]], внутреннее свойство [[TargetFunction]], внутреннее свойство [[BoundThis]] и [ BoundArgs]] внутреннего свойства.

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

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

[1,2,3] instanceof [];

// TypeError: invalid 'instanceof' operand []