In JavaScript, arrays are not true arrays. They are actually objects. So you can't simply do a typeof
check. Because it will return object
π±
But not a problem! Use Array.isArray()
-- finally, there is an easier way to check if a value is an actual array π
const books = ['π', 'π', 'π'];
// Old way
Object.prototype.toString.call(books) === '[object Array]';
// β
Better
Array.isArray(books);
Array is not a true array
Let's see what I mean by this, array
is not a true array.
const array = [];
typeof array; // 'object'
βοΈThat's why you can't use your typical typeof
. Because array is an object
type π
Array.isArray Demo
Alright, let's try this method on other values and see what we get π©βπ¬
These are all arrays, and will return true
// Empty Array
Array.isArray([]); // true
// Array
Array.isArray(['π']); // true
// Array Constructor
Array.isArray(new Array('π')); // true
These are NOT arrays and will return false
// Object
Array.isArray({}); // false
// Object
Array.isArray({book: 'π'}); // false
// Number
Array.isArray(123); // false
// Boolean
Array.isArray(true); // false
// Boolean
Array.isArray(false); // false
// String
Array.isArray('hello'); // false
// Null
Array.isArray(null); // false
// Undefined
Array.isArray(undefined); // false
// NaN
Array.isArray(NaN); // false
instanceof vs Array.isArray
Another popular choice you might is using instanceof
const books = ['π', 'π', 'π'];
books instanceof Array; // true
But...
The problem is it doesn't work with multiple context (e.g. frames or windows). Because each frame has different scopes with its own execution environment. Thus, it has a different global object and different constructors. So if you try to test an array against that frame's context, it will NOT return true
, it will return incorrectly as false
.
π€― What are you talking about??? π If this is floating in your mind. Don't worry, I was too. To understand this, you need to understand JavaScript's execution context. Here's a great video explaining it, An Introduction to Functions, Execution Context and the Call Stack. This is a bit more of an advanced topic, so if you're just a beginner, feel free to skip through it. And when you get a bit more comfortable with JavaScript, then definitely return to this topic. In the meantime, let me try to explain this "multiple context" in non-dev terms.
Explanation in non-dev terms
You can think of frames like different planets. Every planet has its own system, with different gravity pull and composition. So instanceof
only works on our planet, Earth. If you bring it to Mars, it won't work. However, with Array.isArray()
it will work on any planet. It's universal. That's why you should use Array.isArray()
.
// Creating our new "planet" called mars
const mars = document.createElement('iframe');
document.body.appendChild(iframe);
xArray = window.frames[window.frames.length-1].Array;
// Let's make an array in our new "planet", mars
var marsArray = new xArray('π©', 'π¨');
// Using the instanceof tool to test the marsArray
marsArray instanceof Array;
// false --> β doesn't work
// Now, let's try using our universal tool
Array.isArray(marsArray)
// true --> β
great, it works!
Community Input
- Code Sample by @_botol
https://jsfiddle.net/botol/ryu324gw
Resources
- MDN Web Docs: Array.isArray()
- w3schools: Array.isArray()
- MDN Web Docs: instanceof and multiple context
- MDN Web Docs: instanceof vs isArray
- 2ality: instanceof
- StackOverflow: How do you check if a variable is an array in JavaScript?
- StackOverflow: How to check if an object is an array?
- StackOverflow: Difference between using Array.isArray and instanceof Array
- StackOverflow: Is instanceof Array better than isArray in JavaScript?
- GitHub Issue Discussion: instanceof with multiple windows/iframes
- instanceof considered harmful
- How to better check data types in javascript
Thanks for reading β€
Say Hello! Instagram | Twitter | Facebook | Medium | Blog
Top comments (0)