“为什么?”;3 [1, 2];&引用;返回未定义的JavaScript?
我看了GMail做的一些AJAX调用,我注意到有时候调用的返回值以数字开头。示例:(注意第一行后面没有分号) 如果我将其输入到JavaScript控制台中,我将返回未定义。但是,如果第二个参数是数字或字符串,则返回第二个参数。例如:“为什么?”;3 [1, 2];&引用;返回未定义的JavaScript?,javascript,json,jsonp,Javascript,Json,Jsonp,我看了GMail做的一些AJAX调用,我注意到有时候调用的返回值以数字开头。示例:(注意第一行后面没有分号) 如果我将其输入到JavaScript控制台中,我将返回未定义。但是,如果第二个参数是数字或字符串,则返回第二个参数。例如: 3 4 返回4 我的猜测是,他们这样做是为了阻止jsonp类型的攻击,然而,有人知道正在进行的底层评估是什么吗?在第二种情况下,我认为分号“插入”在第一行之后,这将使返回4有意义。但是,我想不出第一个表达式返回未定义的原因。这是为了防止Ajax JSON黑客更改数
3
4
返回4
我的猜测是,他们这样做是为了阻止jsonp类型的攻击,然而,有人知道正在进行的底层评估是什么吗?在第二种情况下,我认为分号“插入”在第一行之后,这将使返回4有意义。但是,我想不出第一个表达式返回未定义的原因。这是为了防止Ajax JSON黑客更改数组构造函数。这是一个老错误,与现代浏览器无关,但必须加以处理 黑客正在重写数组构造函数,因此当读取JSON时,代码将执行构造函数所做的操作。更多说明如下: 顺便说一下,这就是ASP.NET总是发回此类对象的原因:
{d:[]}
这是因为ASI(自动分号插入)是如何工作的。第一个语句被解释为
3[1,2];
所以它是未定义的
。第二个由ASI解释为3;4;代码>即4
ASI规则在某些情况下是违反直觉的,例如,您可能想知道为什么数字和括号之间没有分号?这是有原因的。有关更多详细信息,请阅读以下参考资料:
谷歌可能会给你更多的结果这就是为什么我们从未有过无分号的JavaScript战争。我想OP知道这一点,但实际的问题是“为什么第一条语句返回未定义的,而第二条语句不返回”@Bergi哦,我的错。我留下这个答案,因为它回答了他的部分问题。@Bergi啊,我明白了,属性访问:)我很喜欢{}
,[]
和()
在JS中有多重含义。@freakish:你能指出具体的ASI规则吗?123['foo']
-对数字文本的属性访问。谢谢Brendan把这个放进去<代码>:P
+1在控制台中键入此命令:['a','b','c'][1,2]
(中间有一个\n):您将得到'c'。这证实了freakish的发现。@Bergi我记得,分号只有在遇到违规标记时才会插入。在这种情况下,[
在3
之后是没有问题的,因此引擎不会执行ASI。而且在安全性方面(谷歌可能意识到这一点,并放置了一个无意义的最后元素或其他东西),这实际上比{d:}更糟糕
wrapper-通过定义Number
原型的属性,可以确定最后一个元素的内容是否匹配某个值。(因此,如果有人打算这样做来修复Firefox2-bug…请注意!=)
)(是的,Gmail中的最后一个数字看起来总是0
。)啊,因为逗号运算符将返回其集合中的最后一个元素。非常有趣。
3[1,2];