我正在查看GMail所做的一些AJAX调用,我注意到有时调用的返回值以数字开头。示例:(请注意,第一行后没有分号)
3
[1, 2];
如果我将其输入JavaScript控制台,我将返回未定义的内容。但是,如果第二个参数是数字或字符串,我将返回第二个参数。例如:
3
4
返回4.
我的猜测是他们这样做是为了阻止jsonp类攻击,然而,是否有人知道正在进行什么基础评估?在第二种情况下,我相信在第一行之后“插入”一个分号,这将使返回4有意义。但是,我想不出第一个表达式会返回undefined的原因。
答案 0 :(得分:9)
这是因为ASI(自动分号插入)的工作原理。第一个语句被解释为
3[1,2];
所以它是undefined
。第二个被ASI解释为3;4;
,4
。
ASI规则在某些情况下是违反直觉的,例如您可能想知道为什么数字和括号之间没有分号?嗯,这是有原因的。阅读这些资源以获取更多详细信息:
What are the rules for JavaScript's automatic semicolon insertion (ASI)?
谷歌可能会给你更多的结果。 :)这就是为什么我们有无尽的无分号的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: []}
。