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

pat*_*rjk 15 javascript json jsonp

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

3 
[1, 2];
Run Code Online (Sandbox Code Playgroud)

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

3
4
Run Code Online (Sandbox Code Playgroud)

返回4.

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

fre*_*ish 9

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

3[1,2];
Run Code Online (Sandbox Code Playgroud)

所以它是undefined.第二个是通过ASI解释为3;4;4.

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

JavaScript的自动分号插入(ASI)有哪些规则?

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

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

  • @Bergi啊,我明白了,属性访问:)总是喜欢`{}`,`[]`和`()`在JS中有多重含义. (3认同)
  • @Bergi根据我的记忆,只有在遇到违规令牌时才会插入分号.在这种情况下```在`3`之后没有冒犯,所以引擎不会执行ASI. (2认同)

Flo*_*ine 7

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

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

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