Why does JSON.parse(['1234']) return 1234?
arrays, javascript, json
Solution
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.
Problem
I am having problems understanding the behavior of `JSON.parse`. `JSON.parse` should work for only strings. But it seems to work for an array which contains only one string (even single quoted), if the string contains only numbers. ``` JSON.parse(['1234']) // => 1234 JSON.parse(['1234as']) // => throws error JSON.parse(['123', '123']) // => throws error ```