15

GMail が行う AJAX 呼び出しのいくつかを見ていましたが、呼び出しの戻り値が数字で始まる場合があることに気付きました。例: (最初の行の後にセミコロンがないことに注意してください)

3 
[1, 2];

これを JavaScript コンソールに入力すると、 undefined が返されます。ただし、2 番目のパラメーターが数値または文字列の場合は、2 番目のパラメーターが返されます。例:

3
4

4 を返します。

私の推測では、彼らはjsonpタイプの攻撃を阻止するためにこれを行っていると思いますが、根底にある評価が行われていることを知っている人はいますか? 2番目のケースでは、最初の行の後にセミコロンが「挿入」されていると思います。これにより、4を返すことが理にかなっています。ただし、最初の式が undefined を返す理由が思いつきません。

4

2 に答える 2

9

これは、ASI ( 自動セミコロン挿入 ) がどのように機能するかによるものです。最初のステートメントは次のように解釈されます。

3[1,2];

そうですundefined。2 番目のものは、ASI によって3;4;どちらが であるかとして解釈され4ます。

ASI ルールは、直感に反する場合があります。たとえば、数字と括弧の間にセミコロンがないのはなぜでしょうか? まあ、それには理由があります。詳細については、次のリソースを参照してください。

JavaScript の自動セミコロン挿入 (ASI) の規則は何ですか?

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

Google は、おそらくより多くの結果を提供します。:) それが、セミコロンのない JavaScript戦争が終わることのない理由です。

于 2013-01-31T17:03:57.373 に答える
7

これは、Ajax JSON ハックが Array コンストラクターを変更するのを防ぐためです。これは古いバグで、最新のブラウザーには関係ありませんが、対処する必要があります。

ハックは Array コンストラクターをオーバーライドしているため、JSON が読み取られると、コードはコンストラクターが行うことを実行します。詳細はこちら: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

ところで、これが ASP.NET が常にこの種類のオブジェクトを返す理由です: {d: []}.

于 2013-01-31T17:01:37.427 に答える