Javascript JSON 的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript JSON 的问题相关的知识,希望对你有一定的参考价值。
JS代码片段:
var jsonText = eval(info);
if(jsonText.length == 1 && Enumber == jsonText[0].number);
//alert(jsonText.length + " : " + Enumber + " : " + jsonText[0].number);
document.getElementById(spanID).value = jsonText[0].id;
*注:info为外部传入的字符串,此处将其格式化为JSON串
*注:Enumber为全局变量,是一个字符串。
*注:注释语句用作测试。
问题:
为什么if条件永远为真?
注释语句弹出的消息框却明显的显示出
jasonText.length != 1
Enumber != jsonText[0].number
望速解答,希望回答为什么会这样?并说出解决方法,谢谢。
注意:eval能将符合规则的字符串转化为“对象”!!!!!
假如info=“'name':'godelegant','age':12”;
经过eval后,将得到对象jsonText,因为不是字符串,所以没有length属性。
看你下面的代码,你的info应该是个数组转化的字符串:“[“key”:“value”]”;
该对象是不length属性的。你先打印:alert(jsonText.length );alert(Enumber );alert(jsonText[0].number);
查看其中的值是不是正常取到,再进行判断吧。 参考技术A if(jsonText.length == 1 && Enumber == jsonText[0].number);
//alert(jsonText.length + " : " + Enumber + " : " + jsonText[0].number);
document.getElementById(spanID).value = jsonText[0].id;
if最后多了个分号;,语句终止!!
下面为新的开始本回答被提问者采纳 参考技术B jasonText 是没有length 属性的
所有 JSON 对象都是有效的 JavaScript 对象吗?
【中文标题】所有 JSON 对象都是有效的 JavaScript 对象吗?【英文标题】:Are all JSON objects also valid JavaScript objects? 【发布时间】:2014-07-08 06:20:03 【问题描述】:JSON 标准以一种方式定义对象,ECMAScript (JavaScript) 标准以另一种方式定义它。
人们常说 JSON 对象是 JavaScript 对象的子集,这是真的吗?
每个 JSON 对象也是有效的 JavaScript 对象吗?
【问题讨论】:
【参考方案1】:2019 年更新:从 this proposal 开始,答案现在是YES,并且 ECMAScript 2019(包括)之后的 JavaScript 版本将是适当的超集。
TL;DR
答案是“不”。在某些情况下,JSON 对象对 JavaScript 无效。 JSON 不是 JavaScript 子集。
“小”差异
JSON
即:由于 JSON 规范,您可以安全地在任何字符串中使用此类字符,如 U+2028。它是一个 unicode 空格 字符。不是控件或其他特殊字符。
JavaScript
好吧,现在在 JavaScript 中。 ECMA-262 对字符串的定义略有不同。在section 7.8.4 中有一个东西,该字符串可以包含除引号、反斜杠或行终止符 之外的所有内容。现在什么是行终止符?它在section 7.3:
\u000A - 换行 \u000D - 回车 \u2028 - 行分隔符 \u2029 - 段落分隔符如您所见,在 JavaScript 中,不允许使用 U+2028 和 U+2029 符号。
这是一个示例,但由于我们有至少一个不同的情况,因此意识到答案是否
就足够了图片来源及完整描述:timeles-s-repo
【讨论】:
【参考方案2】:首先,在使用术语“JSON 对象”时应采取一些预防措施:
如果您愿意,“JSON 对象”可以指代 JSON 文本表示的对象。甚至JSON specification 也定义了“对象”的含义:
对象是零个或多个名称/值的无序集合 对
这只是一个意图,因为 JSON 本身不是一种处理语言:它不会将文本解析为对象。
并非所有 JSON 文本都表示对象(例如,它们可以表示字符串或数字字面量),所以说到“JSON 对象”确实有一些附加价值:它是“表示对象的 JSON 文本”的缩写。
这就像说“电子邮件通知”。电子邮件是一种通信机制,一封特定的电子邮件可以代表给您的信息。它可能代表某事的通知,但不一定是。
JSON 与 JavaScript 对象字面量
虽然“JSON 对象”可能是一个有效术语,但它不应用于 JavaScript 对象。 JSON 可以在许多语言平台中使用,因此与 JavaScript 的历史联系真的应该搁置一旁。
JavaScript 对象字面量除了 JSON 之外还有其他语法规则,因此不应混淆。例如:
JSON 要求字符串用双引号括起来,而 JavaScript 对象文字可能有不带引号的属性名称和单引号字符串; JSON 仅限于几种数据类型,而 JavaScript 对象文字可能包括其他数据类型和符号,如正则表达式文字、模板文字、函数等; JSON 不允许在数组字面量中使用空元素,而 JavaScript 字面量则允许(例如[1, , 2]
);
JSON 允许在字符串中使用 U+2028
和 U+2029
字符。在 EcmaScript2019 之前,这些字符需要在 JavaScript 中进行转义。 EcmaScript2019 消除了这种差异;
【讨论】:
JSON 对象在我链接到的规范中得到了很好的定义。 JSON 不再是 JavaScript(或 XML,或 C 是)“文本”——JSON 清楚地定义了哪些属性(在规范中)以及它们的行为方式。它没有定义这些属性的任何行为(因为它是一种数据交换格式)。例如,JSON 对象"x": 1e99999
在语法上是一个有效的 JavaScript 对象,但在语义上超出了 JavaScript 的范围(因为双精度数不能容纳那么大的数字)。
我意识到人们有时会将 JSON 对象误认为 JS 对象,反之亦然,因为它是相同的通用符号,但这不是问题所在。问题是,如果有一个 JSON 对象在被解析为 JavaScript 对象时是无效的(也就是说,证明 JavaScript 的实际对象表示法不是 JSON 对象表示法的“超集”)。在您的所有观点中 - 唯一证明这一点的是最后一个 - 最后一个答案涵盖了。感谢您发布答案!
我完全同意你的看法。我在术语“JSON 对象”上添加了这个介绍,因为它似乎对访问者有用。我经常提到这个有用的问题,比如here。在这种情况下,触及您的问题之外的某些方面似乎很有用。以上是关于Javascript JSON 的问题的主要内容,如果未能解决你的问题,请参考以下文章