Ответ 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 []