Ich habe Probleme, das Verhalten von zu verstehen JSON.parse
. JSON.parse
sollte nur für Strings funktionieren. Es scheint jedoch für ein Array zu funktionieren, das nur eine Zeichenfolge enthält (auch in einfachen Anführungszeichen), wenn die Zeichenfolge nur Zahlen enthält.
JSON.parse(['1234']) // => 1234
JSON.parse(['1234as']) // => throws error
JSON.parse(['123', '123']) // => throws error
javascript
arrays
json
Akshendra Pratap
quelle
quelle
'"foo"'
und"\"foo\""
, sie sind buchstäblich identische Zeichenfolgen.Antworten:
Erwartet, wie Sie bereits betont haben,
JSON.parse()
eine Zeichenfolge und kein Array. Wenn jedoch ein Array oder ein anderer Wert ohne Zeichenfolge angegeben wird, erzwingt die Methode automatisch eine Zeichenfolge und fährt fort, anstatt sofort zu werfen. Aus der Spezifikation :Die Zeichenfolgendarstellung eines Arrays besteht aus seinen durch Kommas getrennten Werten. Damit
String(['1234'])
kehrt zurück'1234'
,String(['1234as'])
kehrt zurück'1234as'
undString(['123', '123'])
kehrt zurück'123,123'
.Beachten Sie, dass Zeichenfolgenwerte nicht erneut in Anführungszeichen gesetzt werden. Dies bedeutet, dass
['1234']
und[1234]
beide in dieselbe Zeichenfolge konvertieren'1234'
.Was Sie also wirklich tun, ist:
JSON.parse('1234') JSON.parse('1234as') JSON.parse('123,123')
1234as
und123,123
sind nicht gültig JSON, und soJSON.parse()
wirft in beiden Fällen. (Ersteres ist zunächst keine legale JavaScript-Syntax, und letzteres enthält einen Kommaoperator, der nicht dazu gehört.)1234
Auf der anderen Seite ist ein Zahlenliteral und daher ein gültiger JSON, der sich selbst darstellt. Und deshalbJSON.parse('1234')
(und im weiteren SinneJSON.parse(['1234'])
) wird der numerische Wert 1234 zurückgegeben.quelle
JSON.parse
nicht sehr streng (insbesondere analysiert es JSON-Objekte und einzelne Werte) . Sehen Sie hier für weitere Informationen.JSON.parse(['[123', '123]'])
: PJSON.parse()
steht im Einklang mit dieser Änderung.Wenn JSON.parse keine Zeichenfolge erhält, wird zuerst die Eingabe in eine Zeichenfolge konvertiert.
["1234"].toString() // "1234" ["1234as"].toString() // "1324as" ["123","123"].toString() // "123,123"
Von all diesen Ausgaben weiß es nur, wie man "1234" analysiert.
quelle
Zwei Dinge, die hier zu beachten sind:
1)
JSON.parse
konvertiert das Argument in eine Zeichenfolge (siehe den ersten Schritt des Algorithmus in der Spezifikation). Ihre Eingabe führt zu folgenden Ergebnissen:['1234'] // String 1234 ['1234as'] // String 1234as ['123', '123'] // String 123,123
2) Die Spezifikationen auf json.org besagen, dass:
Also haben wir:
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 ",")
quelle