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.