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这里和那里都有一些 's 。这就是我提出问题的原因:

  1. 为什么JSON.parse将 a 解释为字符串,如MDNundefined所说,“语法错误” ?undefined
  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

15

undefined不是有效的 JSON 令牌。将未定义的值转换为 JSON 时,正确的做法是将其呈现为 null。

于 2013-07-15T06:51:13.460 回答
10
  1. undefined不是 JSON 文件中的合法标记(请参阅 www.json.org),也不是可接受的参数JSON.parse
  2. 您的代码在语义上与以前的版本不同。以前版本中的许多测试比新版本更详尽(也更不容易出错)
  3. 如果按要求工作,为什么要“重构”该代码?你没有重构它——你已经破坏了它。
于 2013-07-15T06:51:02.540 回答