¿Qué significa esta instancia de mensaje de error?

Estaba jugando con instanceof en Chrome pero recibí un mensaje de error. I pensar Sé por qué (tienes que proporcionar una función después de la instanceof palabra clave 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 debería reemplazar [1,2,3] con una función? Yo pensaría que [1,2,3] es correcto y eso [] es el problema y debería sustituirse por una función, pero parece que el mensaje de error dice lo contrario.

¿Alguien podría explicar cómo interpreto incorrectamente el mensaje de error?

preguntado el 16 de mayo de 11 a las 17:05

1 Respuestas

Los objetos son instancias de una función constructora, por lo que la prueba es ver si la mano izquierda es una en vez de el derecho, por lo que el derecho debe ser una función (y debe ser el constructor que construyó el objeto para devolver true).

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

Entonces, para responder 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 instancia de producción RelationalExpression: RelationalExpression de ShiftExpression se evalúa de la siguiente manera:

  • Sea lref el resultado de evaluar RelationalExpression.
  • Sea lval GetValue (lref).
  • Sea rref el resultado de evaluar ShiftExpression.
  • Sea rval GetValue (rref).
  • Si Type (rval) no es Object, lanza una excepción TypeError.
  • Si rval no tiene un método interno [[HasInstance]], lanza una excepción TypeError.
  • Devuelve el resultado de llamar al método interno [[HasInstance]] 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 funciones

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 creen (consulte 8.6.2, 13.2, 15 y 15.3.4.5), las instancias de función pueden tener una propiedad interna [[HasInstance]], una propiedad interna [[Scope]], una propiedad interna [[Construct]], una propiedad interna [[FormalParameters]], una propiedad interna [[Code]], una propiedad interna [[TargetFunction]], una [[BoundThis ]] propiedad interna y una propiedad interna [[BoundArgs]].

Entonces requiere un TypeError si la mano derecha no tiene un interno [[HasInstance]] propiedad, pero no especifica la redacción.

Firefox 4 me da un mensaje de error mucho más sensato:

[1,2,3] instanceof [];

// TypeError: invalid 'instanceof' operand []

contestado el 16 de mayo de 11 a las 22:05

Ah, está bien, entonces el mensaje de error que indica que espera una función en lugar de lo que se coloca a la izquierda no está realmente bien redactado, ¿es correcto? - pimvdb

@pimvdb: Sí, no entiendo por qué está redactado de esa manera. - user113716

"debe ser el constructor que construyó el objeto para que devuelva verdadero" No es del todo cierto. El operador instanceof comprueba si el operando izquierdo hereda de la propiedad prototype del operando derecho. Entonces, si un objeto es construido por un constructor, y ese constructor hace referencia al mismo objeto en su propiedad de prototipo como otro constructor, instanceof devolverá verdadero si ese objeto se prueba con ambos: var obj={x:1};var class_one=function(){};class_one.prototype=obj;var class_two=function(){};class_two.prototype = obj;var inst = new class_one;inst instanceof class_two; - Brian

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.