Tengo problemas para comprender el comportamiento de JSON.parse . JSON.parse debería funcionar solo para cadenas. Pero parece funcionar para una matriz que contiene solo una cadena (incluso entre comillas simples), si la cadena contiene solo números.
JSON.parse(['1234']) // => 1234 JSON.parse(['1234as']) // => throws error JSON.parse(['123', '123']) // => throws errorComo ha señalado, JSON.parse() espera una cadena y no una matriz. Sin embargo, cuando se le da una matriz o cualquier otro valor que no sea una cadena, el método lo forzará automáticamente a una cadena y procederá en lugar de lanzarlo inmediatamente. De la especificación :
- Deje que JText sea ToString (texto).
- ...
La representación de cadena de una matriz consta de sus valores, delimitados por comas. Asi que
String(['1234']) devuelve '1234' ,String(['1234as']) devuelve '1234as' yString(['123', '123']) devuelve '123,123' . Tenga en cuenta que los valores de cadena no se vuelven a citar. Esto significa que ['1234'] y [1234] se convierten en la misma cadena, '1234' .
Así que lo que realmente estás haciendo es:
JSON.parse('1234') JSON.parse('1234as') JSON.parse('123,123') 1234as y 123,123 no son JSON válidos, por lo que se lanza JSON.parse() en ambos casos. (Para empezar, la primera no es una sintaxis legal de JavaScript, y la última contiene un operador de coma que no pertenece).
1234 , por otro lado, es un número literal y, por lo tanto, JSON válido, que se representa a sí mismo. Y es por eso que JSON.parse('1234') (y por extensión JSON.parse(['1234']) ) devuelve el valor numérico 1234.
Si JSON.parse no obtiene una cadena, primero convertirá la entrada en una cadena.
["1234"].toString() // "1234" ["1234as"].toString() // "1324as" ["123","123"].toString() // "123,123"De todas esas salidas, solo sabe cómo analizar "1234".
Dos cosas a tener en cuenta aquí:
1) JSON.parse convierte el argumento en una cadena (consulte el primer paso del algoritmo en la especificación). Su entrada da como resultado lo siguiente:
['1234'] // String 1234 ['1234as'] // String 1234as ['123', '123'] // String 123,1232) Las especificaciones en json.org establecen que:
[...] Un valor puede ser una cadena entre comillas dobles, o un número, o verdadero, falso o nulo, o un objeto o una matriz. Estas estructuras se pueden anidar.
Entonces tenemos:
JSON.parse(['1234']) // Becomes JSON.parse("1234") // 1234 could be parsed as a number // Result is Number 1234 JSON.parse(['1234as']) // Becomes JSON.parse("1234as") // 1234as cannot be parsed as a number/true/false/null // 1234as cannot be parsed as a string/object/array either // Throws error (complains about the "a") JSON.parse(['123', '123']) // Becomes JSON.parse("123,123") // 123 could be parsed as a number but then the comma is unexpected // Throws error (complains about the ",")