【发布时间】:2011-05-12 16:14:05
【问题描述】:
此代码失败,并出现指示 JSON 无效的异常:
var example = '{ "AKEY": undefined }';
jQuery.parseJSON(example);
我能够通过用空字符串替换所有未定义来修复它。未定义不是 JSON 的一部分吗?
【问题讨论】:
标签: javascript jquery json
此代码失败,并出现指示 JSON 无效的异常:
var example = '{ "AKEY": undefined }';
jQuery.parseJSON(example);
我能够通过用空字符串替换所有未定义来修复它。未定义不是 JSON 的一部分吗?
【问题讨论】:
标签: javascript jquery json
如果你能理解这一点,token undefined 实际上是未定义的。
请允许我详细说明:尽管 JavaScript 有一个特殊的原始值,称为 undefined,undefined 不是 JavaScript 关键字,也没有任何特殊含义。您可以通过定义 undefined 来破坏测试对象是否存在的代码。
var obj = { BKEY: 'I exist!' };
if (obj.AKEY == undefined) console.log ('no AKEY');
if (obj.BKEY == undefined) console.log ('should not happen');
undefined='uh oh';
if (obj.AKEY == undefined) console.log ('oops!'); // Logically, we want this to execute, but it will not!
if (obj.BKEY == undefined) console.log ('should not happen');
唯一的控制台输出将是“无 AKEY”。在我们分配给全局变量 undefined 之后,obj.AKEY == undefined 变为 false,因为 <i>undefined</i> != 'uh oh'。 obj.BKEY == undefined 仍然返回 false,但这只是因为我们很幸运。如果我设置了obj.BKEY='uh oh',那么obj.BKEY == undefined 将是true,即使它确实存在!
您可能希望将AKEY 显式设置为null。 (顺便说一下,null 是关键字;null='uh oh' 抛出异常)。
您也可以简单地从您的 JSON 中省略 AKEY,在这种情况下您会发现:
typeof(example.AKEY) == 'undefined'
(如果您将AKEY 设置为null,则typeof(example.AKEY) == 'object'。)
设置为 null 和省略之间的唯一真正区别是您是否希望键出现在 foreach 循环中。
【讨论】:
不,但null 是。 RFC 4627 §2.1:
JSON 值必须是对象、数组、 数字,或字符串,或其中之一 以下三个字面名称:
false null true
var example = '{ "AKEY": null }';
【讨论】:
正确。未定义和函数未在 JSON 中表示。 http://www.json.org/js.html
【讨论】:
它们在 JSON 中是不允许的...看看替代方案,原因就很清楚了:
var example = '{}';
var obj = jQuery.parseJSON(example);
obj.AKEY //undefined
如果是undefined,当你去访问它时,它甚至与密钥不存在相同。由于 JSON 的主要目的是传输数据(否则更广泛的对象字面量语法就可以了)……最好完全不使用它。
【讨论】:
{} 和 {AKEY: undefined} 之间有 区别。对于后者,AKEY 将出现在 for each 枚举中。