7

Is it correct to use obj.constructor === Array to test if an object is an array as suggested here? Does it always returns correct answer compatible with Array.isArray?

3
  • you can also use the boolean return from "obj instanceof Array", but like your version, it only returns true for an Array of the same window scope. Commented Feb 12, 2015 at 1:03
  • Do you have read any of the other answers on that question? blog.niftysnippets.org/2010/09/say-what.html Commented Apr 1, 2015 at 20:08
  • @Bergi Yes, when I asked this question I was interested to learn more about obj.constructor === Class as well. Commented Apr 1, 2015 at 20:14

1 Answer 1

12

Depends, there are a few scenarios where it can return a different value, but Array.isArray will work.

The Array object for one window is not the the same Array object in another window.

var obj = someIframe.contentWindow.someArray;
console.log(obj.constructor === Array);//false
console.log(Array.isArray(obj));//true

The constructor property can be overwritten.

var obj = [];
obj.constructor = null;
console.log(obj.constructor === Array);//false
console.log(Array.isArray(obj));//true

Another object can also set the constructor property to Array.

var obj = {};
obj.constructor = Array;
console.log(obj.constructor === Array);//true
console.log(Array.isArray(obj));//false
Sign up to request clarification or add additional context in comments.

2 Comments

Also: var arr = []; arr.__proto__ = Object.create(Array.prototype, {constructor: {value: MyArraySubclass}});
Also consider that obj could be undefined

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.