Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“为什么?”;3 [1, 2];&引用;返回未定义的JavaScript?_Javascript_Json_Jsonp - Fatal编程技术网

“为什么?”;3 [1, 2];&引用;返回未定义的JavaScript?

“为什么?”;3 [1, 2];&引用;返回未定义的JavaScript?,javascript,json,jsonp,Javascript,Json,Jsonp,我看了GMail做的一些AJAX调用,我注意到有时候调用的返回值以数字开头。示例:(注意第一行后面没有分号) 如果我将其输入到JavaScript控制台中,我将返回未定义。但是,如果第二个参数是数字或字符串,则返回第二个参数。例如: 3 4 返回4 我的猜测是,他们这样做是为了阻止jsonp类型的攻击,然而,有人知道正在进行的底层评估是什么吗?在第二种情况下,我认为分号“插入”在第一行之后,这将使返回4有意义。但是,我想不出第一个表达式返回未定义的原因。这是为了防止Ajax JSON黑客更改数

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

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

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];