Javascript 在JSON中,为什么要引用每个名称?

Javascript 在JSON中,为什么要引用每个名称?,javascript,json,Javascript,Json,表示JSON是一个对象或数组。在对象的情况下 对象结构表示为一对花括号 围绕零个或多个名称/值对(或成员)一个名字就是一个名字 字符串。 后来,规范说字符串用引号括起来 为什么? 因此, {“Property1”:“Value1”,“Property2”:18} 而不是 {Property1:“Value1”,Property2:18} 问题1:为什么不允许名称/值对中的名称作为不带引号的标识符 问题2:在Javascript中计算时,上述两种表示法之间是否存在语义差异?标识符中允许使用:

表示JSON是一个对象或数组。在对象的情况下

对象结构表示为一对花括号 围绕零个或多个名称/值对(或成员)一个名字就是一个名字 字符串。

后来,规范说字符串用引号括起来

为什么?

因此,

{“Property1”:“Value1”,“Property2”:18}
而不是

{Property1:“Value1”,Property2:18}
问题1:为什么不允许名称/值对中的名称作为不带引号的标识符



问题2:在Javascript中计算时,上述两种表示法之间是否存在语义差异?

标识符中允许使用
和空格。如果没有引号,在试图确定标识符的确切构成时,这将导致歧义

问题1:为什么不允许名称/值对中的名称作为不带引号的标识符

JSON的设计理念是“保持简单”

“用
引用名称”
比“您可以用
引用名称”
简单得多,但您不必这样做,除非它们包含某些字符(或使其成为关键字的字符组合)和
可能需要根据您选择的分隔符进行引用”

问题2:当在Javascript中进行计算时,上述两种表示之间是否存在语义差异


不。在JavaScript中它们是相同的。

我引用了Douglas Crockford(JSON标准的创建者)给Yahoo的一篇演讲

他谈到了他是如何发现JSON的,以及他决定使用引用键的原因:

。。。。 就在那时我们发现了 没有引号的名字问题。结果是 ECMA脚本3保留了一个重击 单词策略。保留的单词必须是 在关键位置引用,即 真讨厌。当我四处走动的时候 为了将其公式化为标准,我 不想把所有的 标准中的保留字, 因为这看起来很愚蠢

当时,我正试图说服 人们:是的,你可以写作 JavaScript中的应用程序,它是 真的要去工作了,这是一个好机会 语言,我不想说, 同时:看看这个 他们做了一件很愚蠢的事!所以我 相反,让我们引用 钥匙。
这样,我们就不用说了 任何人都知道这有多糟糕

这就是为什么,直到今天,钥匙都被引用了 JSON


您可以找到完整的视频和文字记录。

如果json描述了对象,那么在实践中您可以得到以下内容

var foo = {};

var bar = 1;

foo["bar"] = "hello";
foo[bar] = "goodbye";
那么

foo.bar == "hello";
foo[1] == "goodbye" // in setting it used the value of var bar

因此,即使您的示例确实产生相同的结果,它们在“原始代码”中的等价物也不会产生相同的结果。也许这就是为什么??不知道,这只是一个想法。

在javascript中,对象可以像具有键对的哈希表/哈希表一样使用

但是,如果您的键包含javascript无法标记为名称的字符,则在尝试像对象而不是键上的属性那样访问时,它将失败

var test  = {};
test["key"] = 1;
test["#my-div"] = "<div> stuff </div>";

// test = { "key": 1, "#my-div": "<div> stuff </div>" };

console.log(test.key);           // should be 1
console.log(test["key"]);        // should be 1
console.log(test["#my-div"]);    // should be "<div> stuff </div>";
console.log(test.#my-div);       // would not work.
var-test={};
测试[“键”]=1;
测试[“#我的div”]=“东西”;
//test={“key”:1,“#my div”:“stuff”};
console.log(test.key);//应为1
console.log(test[“key”];//应该是1
log(test[“#my div”];//应该是“stuff”;
console.log(test.#my div);//无法工作。

标识符有时可能包含无法在javascript中作为标记/标识符计算的字符,因此最好将所有标识符放在字符串中以保持一致性。

我认为Cheeso的问题的正确答案是实现超越了文档。它不再需要字符串作为键,而是需要一些lse,它可以是一个字符串(即引号)或(可能)任何可以用作变量名的东西,我猜这意味着以字母、u或$开头,只包括字母、数字和$和u

我想为下一个带着与我相同的想法访问此问题的人简化其余部分。以下是要点:

变量名用作对象键时,不会在JSON中插入(感谢Friedo!)

Breton使用“identifier”而不是“key”,写道“如果一个标识符恰好是一个保留字,它将被解释为该字而不是标识符。”这可能是真的,但我尝试了一下,没有遇到任何问题:

var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7};
a.break
=>6

关于使用引号,昆汀写道:“……但你不必这样做,除非[键]包含某些字符(或使其成为关键字的字符组合)。”

我发现前一部分(某些字符)是正确的,使用@符号(事实上,我认为$and u是唯一不会导致错误的字符):

=>语法错误

var a = {"a@b":1};
a['a@b']
=>1

但是,正如我上面所展示的,关于关键词的附加说明是不正确的

我想要的是,因为在开头{和冒号之间的文本,或者后续属性的逗号和冒号之间的文本被用作无引号字符串来生成对象键,或者,正如Friedo所说,变量名不会被插入:

var uid = getUID();
var token = getToken();            // Returns ABC123
var data = {uid:uid,token:token};
data.token

=>ABC123

如果只在必要时才允许在名称上加引号,则可能会减少数据大小

@Bruno:你可以用同样的方式来谈论XML……不幸的是,有些人可能正试图将XML用作编程语言……+1……这似乎是一个特殊的矛盾……“加引号”使其成为标准JSON,但不能与
eval一起使用()
(即javascript)。@bruno,否。如果您将其展开,它将变成“在javascript对象表示法中”,即fine@skaffman-当在JavaScript中求值时,它将起作用。@Bruno-JSON是一种数据格式。“在JSON中”是指-根据规范格式化数据。@David,变量名在JS中用作对象键时不会插入。
{bar:
var uid = getUID();
var token = getToken();            // Returns ABC123
var data = {uid:uid,token:token};
data.token