在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"
} ;
这两者有什么区别?
答案 0 :(得分:31)
@AndreasN is correct:JSON specification指示使用引号以使其实际上是JSON。如果您不使用引号,它可能是Javascript中的有效对象文字,但它不是JSON。除浏览器端Javascript之外的其他服务使用JSON(例如使用php,Java等的webservices),如果构造一个缺少引号的字符串,则无法保证它将被正确解析 - 尽管我怀疑大多数实现都是足够强大。
仅供参考,在Javascript中直接使用来自您无法阻止恶意攻击的来源的JSON字符串的eval()是危险的。再次,请参阅JSON site,它提供了更多解释以及一个非常简短的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只能表示具有树结构的对象(例如,整个对象的每个子元素都是独立的)。
答案 1 :(得分:8)
如果IE因你的第二个例子而失败,那是因为'Class'是一个保留字(仅在IE中)。一般来说,最好用引号括起您的属性名称 - 这意味着它总是可以工作,无论情况如何。
答案 2 :(得分:7)
答案 3 :(得分:5)
您必须在包含除字词
之外的任何内容的属性周围使用“引号”{foo-bar: 3} // invalid
{"foo-bar": 3} // valid
除此之外,两者之间没有区别,我想两种方式都适用于所有浏览器