私はこれを変換しました:
function MangaElt(obj) {
"use strict";
this.mirror = obj.mirror;
this.name = obj.name;
this.url = obj.url;
if (obj.lastChapterReadURL !== undefined) {
this.lastChapterReadURL = obj.lastChapterReadURL;
this.lastChapterReadName = obj.lastChapterReadName;
} else {
this.lastChapterReadURL = null;
this.lastChapterReadName = null;
}
this.listChaps = [];
if (obj.listChaps !== undefined && obj.listChaps !== null && obj.listChaps !== "null") {
if (!isArray(obj.listChaps)) {
this.listChaps = JSON.parse(obj.listChaps);
}
}
this.read = 0;
if (obj.read !== undefined && obj.read !== null && obj.read !== "null") {
this.read = obj.read;
}
}
これに:
function MangaElt(obj) {
"use strict";
this.mirror = obj.mirror;
this.name = obj.name;
this.url = obj.url;
this.lastChapterReadURL = obj.lastChapterReadURL || null;
this.lastChapterReadName = obj.lastChapterReadName || null;
this.listChaps = JSON.parse(obj.listChaps) || [];
this.read = obj.read || 0;
this.update = obj.update || 1;
}
ご覧のとおり、コードはより読みやすくコンパクトになりました。スニペットは、通常の状況では問題なく機能します。obj
問題は、オブジェクトにすべての値が含まれていない場合があることundefined
です。そして、それが私の質問の理由です:
- なぜaを文字列として
JSON.parse
解釈し、 MDNのように「構文エラー」と解釈するのですか?undefined
undefined
- では、値が適切な文字列であるかどうかを解析する前に確認する必要がありますか?
- JSON.parse ではなく、解析された値が常にチェックされ
undefined
、単に返されundefined
ますか? (これは議論を呼ぶかもしれないので、そのままでいいと思うなら、この質問を無視するか、私のトラフの流れが間違っているだけだと述べてください) - #2が肯定的である場合、最初に切り取られたものとして条件を追加するだけで十分ですよね?それとも、MangaElt を呼び出す関数に移動して、それ
obj.listChaps
が配列であることを確認し、ここを忘れるべきでしょうかJSON.parse
? (これは常に文字列内の配列または疑似配列であり、これは共同プロジェクトであるため、誰かがこれに理由を持っている可能性があります)
「エラーは何ですか?」と尋ねるかもしれない好奇心のために。これは:
Error in event handler for 'undefined': Unexpected token u SyntaxError: Unexpected token u
at Object.parse (native)
at new MangaElt (chrome-extension://nhjloagockgobfpopemejpgjjechcpfd/js/MangaElt.js:44:25)
at readManga (chrome-extension://nhjloagockgobfpopemejpgjjechcpfd/js/background.js:410:24)
at chrome-extension://nhjloagockgobfpopemejpgjjechcpfd/js/background.js:607:9
at Event.dispatchToListener (event_bindings:356:21)
at Event.dispatch_ (event_bindings:342:27)
at Event.dispatch (event_bindings:362:17)
at miscellaneous_bindings:165:24
at Event.dispatchToListener (event_bindings:356:21)
at Event.dispatch_ (event_bindings:342:27) event_bindings:346
編集:これは、既存のエントリがどのように見えるかであり、エラーは発生しません。このシナリオが私の質問の動機です。キーのタイプは常に同じで、事前にテストされます。
name
文字列ですmirror
文字列ですurl
文字列ですlistChaps
文字列内の「配列」ですts
およびupts
は整数
ところで、obj
オブジェクトですが、見逃すことはほとんど不可能だと思います。また、これは Chrome 拡張機能ですが、関係ないと思います。ここでスクリプトを完成させます。