exebook exebook - 24 days ago 5x
Javascript Question

No semicolon before [] is causing error in Javascript?

var a = [1,2,3,4];
var b = [10,20,30,40];
[a,b].some(function(x){ x.push(x.shift()) });

I was extremely surprised today when this code caused

[a,b].some(function(x){ x.push(x.shift()) });
TypeError: Cannot call method 'some' of undefined

Obviously the JavaScript 'auto semicolon insertion' is not working as expected here. But why?

I know you might recommend to use
everywhere to avoid something like that, but the question is not about whether it is better to use
or not. I would love to know what exactly happens here?


When I'm worried about semicolon insertion, I think about what the lines in question would look like without any whitespace between them. In your case, that would be:

console.log([a,b].length)[a,b].some(function(x){ etc });

Here you're telling the Javascript engine to call console.log with the length of [a,b], then to look at index [a,b] of the result of that call.

console.log returns a string, so your code will attempt to find property b of that string, which is undefined, and the call to undefined.some() fails.

It's interesting to note that str[a,b] will resolve to str[b] assuming str is a string. As Kamil points out, a,b is a valid Javascript expression, and the result of that expression is simply b.