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', andString(['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.