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()
は配列ではなく文字列を想定しています。しかし、配列やその他の文字列でない値が与えられると、このメソッドは自動的にそれを文字列に変換し、すぐに投げずに処理を進めます。から
仕様
:
- JTextをToString(text)とする。
- ...
配列の文字列表現は、カンマで区切られた値で構成されます。そのため
-
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を返します。
関連
-
[解決済み】JavaScriptで「無効な日付」のDateインスタンスを検出する
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み] UTF-8 byte[]を文字列に変換する方法
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] ECMAScriptとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 有効なJSONの最小値は?
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] 変異を伴わないオブジェクトからの値の削除