As you have pointed out, JSON.parse() expects a string and not an array. However, when given an array or any other non-string value, the method will automatically coerce it to a string and proceed instead of throwing immediately. From the spec:
- Let JText be ToString(text).
- ...
The string representation of an array consists of its values, delimited by commas. So
String(['1234']) returns '1234',
String(['1234as']) returns '1234as', and
String(['123', '123']) returns '123,123'.
Notice that string values are not quoted again. This means that ['1234'] and [1234] both convert to the same string, '1234'.
So what you're really doing is:
JSON.parse('1234')
JSON.parse('1234as')
JSON.parse('123,123')
1234as and 123,123 are not valid JSON, and so JSON.parse() throws in both cases. (The former isn't legal JavaScript syntax to begin with, and the latter contains a comma operator that doesn't belong.)
1234 on the other hand is a Number literal and therefore valid JSON, representing itself. And that's why JSON.parse('1234') (and by extension JSON.parse(['1234'])) returns the numeric value 1234.