1. ホーム
  2. javascript

JSON.parse(['1234'])はなぜ1234を返すのですか?

2023-10-25 04:15:50

質問

の挙動を理解するのに苦労しています。 JSON.parse . JSON.parse は文字列のみに対して動作するはずです。しかし、文字列を1つだけ含む配列(シングルクォートでも)、その文字列が数字だけを含む場合は、動作するようです。

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

どのように解決するのですか?

ご指摘の通りです。 JSON.parse() は配列ではなく文字列を想定しています。しかし、配列やその他の文字列でない値が与えられると、このメソッドは自動的にそれを文字列に変換し、すぐに投げずに処理を進めます。から 仕様 :

  1. JTextをToString(text)とする。
  2. ...

配列の文字列表現は、カンマで区切られた値で構成されます。そのため

  • String(['1234']) リターン '1234' ,
  • String(['1234as']) リターン '1234as'
  • String(['123', '123']) を返す '123,123' .

文字列の値が再び引用符で囲まれていないことに注意してください。これは、以下のことを意味します。 ['1234'][1234] はどちらも同じ文字列に変換されます。 '1234' .

つまり、本当にやっていることは

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

1234as そして 123,123 は有効なJSONではないので JSON.parse() は両方のケースで投げます。(前者はそもそも合法的な JavaScript 構文ではなく、後者は属さないカンマ演算子を含んでいます)。

1234 は、Number リテラルであり、したがって有効な JSON であり、それ自身を表しています。そのため JSON.parse('1234') (そしてその延長として JSON.parse(['1234']) は数値1234を返します。