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
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 :
- Soit JText To ToString (text).
- ...
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'
, etString(['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.
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".
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 ",")