Why does JSON.parse([‘1234’]) return 1234?

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:

  1. 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.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)