为什么" 3 [1,2];"在JavaScript中返回undefined?

时间:2013-01-31 16:57:44

标签: javascript json jsonp

我正在查看GMail所做的一些AJAX调用,我注意到有时调用的返回值以数字开头。示例:(请注意,第一行后没有分号)

3 
[1, 2];

如果我将其输入JavaScript控制台,我将返回未定义的内容。但是,如果第二个参数是数字或字符串,我将返回第二个参数。例如:

3
4

返回4.

我的猜测是他们这样做是为了阻止jsonp类攻击,然而,是否有人知道正在进行什么基础评估?在第二种情况下,我相信在第一行之后“插入”一个分号,这将使返回4有意义。但是,我想不出第一个表达式会返回undefined的原因。

2 个答案:

答案 0 :(得分:9)

这是因为ASI(自动分号插入)的工作原理。第一个语句被解释为

3[1,2];

所以它是undefined。第二个被ASI解释为3;4;4

ASI规则在某些情况下是违反直觉的,例如您可能想知道为什么数字和括号之间没有分号?嗯,这是有原因的。阅读这些资源以获取更多详细信息:

What are the rules for JavaScript's automatic semicolon insertion (ASI)?

http://bclary.com/2004/11/07/#a-7.9.1

谷歌可能会给你更多的结果。 :)这就是为什么我们有无尽的无分号的JavaScript 战争。

答案 1 :(得分:7)

这是为了防止Ajax JSON破解更改Array构造函数。这是一个旧的错误,与现代浏览器无关,但必须进行处理。

hack正在覆盖Array构造函数,因此当读取JSON时,代码将执行构造函数的操作。这里有更多解释:http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

顺便说一句,这就是为什么ASP.NET总是发回这种对象的原因:{d: []}