Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
134
rated 0 times [  141] [ 7]  / answers: 1 / hits: 17592  / 13 Years ago, mon, may 16, 2011, 12:00:00

I was playing around with instanceof in Chrome but I got an error message. I think I know why (you have to supply a function after the instanceof keyword that is the constructor the object was created with), but the error message seems to be stating something else:



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

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


Does this mean that I should replace [1,2,3] with a function? I would think that [1,2,3] is correct and that [] is the problem and should be replaced with a function, but it looks like the error message is saying the opposite.



Could someone please explain how I'm interpreting the error message incorrectly?


More From » instanceof

 Answers
10

Objects are instances of a constructor function, so the test is to see if the left hand is an instance of the right, so the right must be a function (and it must be the constructor that constructed the object to return true).



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





So to answer the question more directly, your initial understanding is correct, and the error message seems misleading (to me anyway).



From the spec: http://ecma262-5.com/ELS5_HTML.htm#Section_11.8.6




1.8.6 The instanceof operator



The production RelationalExpression: RelationalExpression instanceof ShiftExpression is evaluated as follows:




  • Let lref be the result of evaluating RelationalExpression.

  • Let lval be GetValue(lref).

  • Let rref be the result of evaluating ShiftExpression.

  • Let rval be GetValue(rref).

  • If Type(rval) is not Object, throw a TypeError exception.

  • If rval does not have a [[HasInstance]] internal method, throw a TypeError exception.

  • Return the result of calling the [[HasInstance]] internal method of rval with argument lval.




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



15.3.5 Properties of Function Instances




In addition to the required internal properties, every function instance has a [[Call]] internal property and in most cases use a different version of the [[Get]] internal property. Depending on how they are created (see 8.6.2 ,13.2, 15, and 15.3.4.5), function instances may have a [[HasInstance]] internal property, a [[Scope]] internal property, a [[Construct]] internal property, a [[FormalParameters]] internal property, a [[Code]] internal property, a [[TargetFunction]] internal property, a [[BoundThis]] internal property, and a [[BoundArgs]] internal property.




So it requires a TypeError if the right hand does not have an internal [[HasInstance]] property, but doesn't specify the wording.



Firefox 4 gives me a much more sensible error message:



[1,2,3] instanceof [];

// TypeError: invalid 'instanceof' operand []

[#92212] Saturday, May 14, 2011, 13 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
aman

Total Points: 341
Total Questions: 92
Total Answers: 92

Location: Papua New Guinea
Member since Thu, Jul 9, 2020
4 Years ago
;