Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 属性名称的JSON语法_Javascript_Json_Syntax - Fatal编程技术网

Javascript 属性名称的JSON语法

Javascript 属性名称的JSON语法,javascript,json,syntax,Javascript,Json,Syntax,用javascript创建对象的正确语法是什么,这些对象可以在大多数web浏览器上运行(我指的是:IE 6+、Firefox 2+、Opera 9+) 这有效吗 var a = { "class": "Person", "name": "William Shakespeare", "birthday": -12802392000000, "nickname": "Bill" }; 或者这是: var a = { class: "Person", name: "Willi

用javascript创建对象的正确语法是什么,这些对象可以在大多数web浏览器上运行(我指的是:IE 6+、Firefox 2+、Opera 9+)

这有效吗

var a = {
  "class": "Person",
  "name": "William Shakespeare",
  "birthday": -12802392000000,
  "nickname": "Bill"
};
或者这是:

var a = {
  class: "Person",
  name: "William Shakespeare",
  birthday: -12802392000000,
  nickname: "Bill"
};
这两者之间有什么区别呢?

我们说使用“”

Firefox不接受,但IE不接受

对的定义为

string : value
" chars "
值可以是字符串 字符串定义为

string : value
" chars "
您必须在包含除单词字符以外的任何内容的属性周围使用“引号”

{foo-bar: 3} // invalid
{"foo-bar": 3} // valid

除此之外,两者之间没有区别,我认为这两种方法都适用于所有浏览器

如果IE在第二个示例中失败,那是因为“Class”是一个保留字(仅在IE中)。一般来说,最好用引号将属性名括起来——这样做意味着无论在什么情况下,它都能正常工作。

:为了使它真正成为JSON,必须使用引号。如果不使用引号,它可能是Javascript中有效的对象文字,但不是JSON。除了浏览器端Javascript之外的其他服务都使用JSON(例如,使用php、Java等的Web服务),如果您构造的字符串没有引号,则无法保证它会被正确解析——尽管我怀疑大多数实现都足够健壮

仅供参考,在Javascript中,直接对来自无法防止恶意攻击的源的JSON字符串使用eval()是危险的。再次,请参阅,它提供了更多的解释以及一个非常短的javascript文件,该文件可以安全地将JSON字符串解析为javascript对象

编辑:从技术上讲,我想你最初的问题不是关于JSON,而是关于对象文本的Javascript语法。不同之处在于,可从JSON字符串构造的对象将排除许多其他可能的对象文本,例如:

var a = {cat: "meow", dog: "woof"};
var aname = {cat: "Garfield", dog: "Odie"};
var b = {
  counter: 0,
  pow: function(x) { return x+1; },
  zap: function(y) { return (counter += y); }
};
var c = {
  all: [a,aname],
  animals: a,
  names: aname,
};

对象文本“a”和“aname”可以用JSON表示(通过在属性名中添加引号)。但是对象文字“b”和“c”不能。对象文本“b”包含函数(JSON中不允许)。上面的对象文字“c”包含对其他变量的引用,这种引用在JSON中不可表示,因为有些引用是共享的。如果更改
c.names
,也会更改
c.all[1]
,因为它们共享对同一变量的引用。JSON只能表示具有树状结构的对象(例如,整个对象的每个子元素都是独立的)。

是的,我没有注意到,在所有浏览器中,unquoted methodclass实际上是一个保留字。只是IE在使用时决定失败。