Pregunta ¿Por qué JSON.parse (['1234']) devuelve 1234?


Tengo problemas para entender 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 una sola cita), si la cadena contiene solo números.

JSON.parse(['1234']) // => 1234
JSON.parse(['1234as']) // => throws error
JSON.parse(['123', '123']) // => throws error

75
2018-05-01 10:57


origen


Respuestas:


Como usted 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 de cadena, el método lo forzará automáticamente a una cadena y procederá en lugar de tirar inmediatamente. Desde el especulación:

  1. Deje que JText sea ToString (texto).
  2. ...

La representación de cadena de una matriz consta de sus valores, delimitados por comas. Asi que

  • String(['1234']) devoluciones '1234',
  • String(['1234as']) devoluciones '1234as'y
  • String(['123', '123']) devoluciones '123,123'.

Tenga en cuenta que los valores de cadena no se vuelven a citar. Esto significa que ['1234'] y [1234] ambos se convierten a la misma cadena, '1234'.

Entonces, 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, y entonces JSON.parse() lanza en ambos casos. (El primero no es la sintaxis de JavaScript legal para empezar, y el último contiene un operador de coma que no pertenece).

1234 por otro lado, es un número literal y, por lo tanto, válido, JSON, que se representa a sí mismo. Y es por eso JSON.parse('1234') (y por extensión JSON.parse(['1234'])) devuelve el valor numérico 1234.


179
2018-05-01 11:04



Si JSON.parse no obtiene una cadena, primero convertirá la entrada en cadena.

["1234"].toString() // "1234"
["1234as"].toString() // "1324as"
["123","123"].toString() // "123,123"

De todas esas salidas solo sabe cómo analizar "1234".


21
2018-05-01 11:05



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,123

2) Las especificaciones en json.org Establece eso, afirma eso:

[...] Un valor puede ser una cadena entre comillas dobles, o un número, o verdadero   o falso o nulo, o un objeto o una matriz. Estas estructuras pueden ser   anidado.

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 ",")

4
2018-05-02 10:08