javascript - w3school - ¿Qué significa este mensaje de error de ejemplo?
title js (1)
Estaba jugando con instanceof
en Chrome pero recibí un mensaje de error. Creo que sé por qué (tiene que proporcionar una función después de la palabra clave instanceof
que es el constructor con el que se creó el objeto), pero el mensaje de error parece indicar algo más:
[1,2,3] instanceof Array
// true
[1,2,3] instanceof []
// TypeError: Expecting a function in instanceof check, but got 1,2,3
¿Significa esto que debo reemplazar [1,2,3]
con una función? Creo que [1,2,3]
es correcto y que []
es el problema y debería ser reemplazado por una función, pero parece que el mensaje de error dice lo contrario.
¿Podría alguien explicar cómo interpreto incorrectamente el mensaje de error?
Los objetos son instancias de una función constructora, por lo que la prueba es para ver si la mano izquierda es una instancia de la derecha, por lo que la derecha debe ser una función (y debe ser el constructor que construyó el objeto para que se devuelva true
).
[1,2,3] instanceof [].constructor; // true
Entonces, para responder a la pregunta de manera más directa, su comprensión inicial es correcta y el mensaje de error parece engañoso (para mí de todos modos).
De la especificación: http://ecma262-5.com/ELS5_HTML.htm#Section_11.8.6
1.8.6 El operador instanceof
La producción RelationalExpression: RelationalExpression instanceof ShiftExpression se evalúa de la siguiente manera:
- Sea lref el resultado de evaluar RelationalExpression.
- Deje que lval sea GetValue (lref).
- Sea rref el resultado de evaluar ShiftExpression.
- Deje rval ser GetValue (rref).
- Si el Tipo (rval) no es Objeto, lance una excepción TypeError.
- Si rval no tiene un método interno [[HasInstance]], lance una excepción TypeError.
- Devuelve el resultado de llamar al [[HasInstance]] método interno de rval con el argumento lval.
y http://ecma262-5.com/ELS5_HTML.htm#Section_15.3.5
15.3.5 Propiedades de las instancias de función
Además de las propiedades internas requeridas, cada instancia de función tiene una propiedad interna [[Call]] y en la mayoría de los casos usa una versión diferente de la propiedad interna [[Get]]. Dependiendo de cómo se crean (ver 8.6.2, 13.2, 15 y 15.3.4.5), las instancias de la función pueden tener una propiedad interna [[HasInstance]] , una propiedad interna [[Scope]], una [[Construct]] propiedad interna, una propiedad interna [[FormalParameters]], una propiedad interna [[Code]], una propiedad interna [[TargetFunction]], una propiedad interna [[BoundThis]] y una propiedad interna [[BoundArgs]].
Por lo tanto, se requiere un TypeError
si la mano derecha no tiene una propiedad interna [[HasInstance]]
, pero no especifica la redacción.
Firefox 4 me da un mensaje de error mucho más sensible:
[1,2,3] instanceof [];
// TypeError: invalid ''instanceof'' operand []