web-dev-qa-db-fra.com

Pourquoi JSON.parse (['1234']) renvoie-t-il 1234?

J'ai du mal à comprendre le comportement de JSON.parse. JSON.parse devrait fonctionner uniquement pour les chaînes. Mais cela semble fonctionner pour un tableau qui ne contient qu'une seule chaîne (même une seule citation), si la chaîne ne contient que des nombres.

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

Comme vous l'avez fait remarquer, JSON.parse() attend une chaîne et non un tableau. Cependant, lorsqu'un tableau ou toute autre valeur non-chaîne est donnée, la méthode le contraindra automatiquement à une chaîne et procédera au lieu d'être immédiatement lancée. De la spec :

  1. Soit JText To ToString (text).
  2. ...

La représentation sous forme de chaîne d'un tableau se compose de ses valeurs, délimitées par des virgules. Alors

  • String(['1234']) renvoie '1234',
  • String(['1234as']) renvoie '1234as', et
  • String(['123', '123']) renvoie '123,123'.

Notez que les valeurs de chaîne ne sont plus citées. Cela signifie que ['1234'] Et [1234] Sont tous deux convertis dans la même chaîne, '1234'.

Donc, ce que vous faites réellement est:

JSON.parse('1234')
JSON.parse('1234as')
JSON.parse('123,123')

1234as Et 123,123 Ne sont pas des JSON valides, et donc JSON.parse() est lancé dans les deux cas. (Le premier n'est pas une syntaxe JavaScript légale pour commencer, et le dernier contient un opérateur de virgule qui n'appartient pas.)

1234 Est par contre un littéral numérique et donc un JSON valide, qui le représente. Et c’est pourquoi JSON.parse('1234') (et par extension JSON.parse(['1234'])) renvoie la valeur numérique 1234.

180
BoltClock

Si JSON.parse n'obtient pas de chaîne, il convertira d'abord l'entrée en chaîne.

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

De toutes ces sorties, il sait seulement comment analyser "1234".

21
naortor

Deux choses à noter ici:

1) JSON.parse convertit l'argument en chaîne (reportez-vous à la première étape de l'algorithme dans la spécification). Vos entrées ont les résultats suivants:

['1234']       // String 1234
['1234as']     // String 1234as
['123', '123'] // String 123,123

2) Les spécifications de json.org précisent que:

[...] Une valeur peut être une chaîne entre guillemets, un nombre, ou true ou false ou null, ou encore un objet ou un tableau. Ces structures peuvent être imbriquées.

Nous avons donc:

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
Salman A