8

私はこれを変換しました:

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です。そして、それが私の質問の理由です:

  1. なぜaを文字列としてJSON.parse解釈し、 MDNのように「構文エラー」と解釈するのですか?undefinedundefined
  2. では、値が適切な文字列であるかどうかを解析する前に確認する必要がありますか?
  3. JSON.parse ではなく、解析された値が常にチェックされundefined、単に返されundefinedますか? (これは議論を呼ぶかもしれないので、そのままでいいと思うなら、この質問を無視するか、私のトラフの流れが間違っているだけだと述べてください)
  4. #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 拡張機能ですが、関係ないと思います。ここでスクリプトを完成させます。

4

2 に答える 2