5

私は今日、アプリケーションで不正なAJAXリクエストのトラブルシューティングを行っているときに奇妙な出来事に遭遇しました。jQuery.paramリクエスト文字列の作成に使用して、データをサーバーに送り返します。

あるシナリオでは、param関数にフィードされたオブジェクトにnullオプションがあったため、次のようになりました。

var myData = {
     x : 1,
     y : null
};
var params = jQuery.param(myData);

このコードは実際にはバックボーンコレクションに埋め込まれていますが、原則は同じです。

さて、サーバーが受け取ったときに、変数のパラメーターが。ではなくyリテラル文字列であったとき、私は完全にショックを受けました。"null"null

少し掘り下げた後、私はそれencodeURIComponent(null)が文字列を返し、"null"さらに興味深いことに同様に'' + null降伏することを発見しました。"null"これは、Chrome23とFirefox11でテストされました。

最終的にjQuery.param関数に送信されるオブジェクトは、関数への引数から構築され、nullはパラメーターの完全に有効な値です。オブジェクトをで構築するだけで回避できましたy : param || ''が、ネイティブJS関数の明らかな誤りと、'' + null = "null"一般に2つの異なる概念と見なされている理由について、興味があります。

4

1 に答える 1

3

オーバーロード+された演算子は、演算を実行する前に、両方のオペランドを共通の型に変換しようとします。どちらかのオペランドが文字列の場合、両方のオペランドを文字列に変換してから、文字列の連結を実行します。

演算子の動作については、 ecmascriptの定義を参照してください。+

Type(lprim)がStringであるか、Type(rprim)がStringである場合、ToString(lprim)とそれに続くToString(rprim)を連結した結果である文字列を返します。

于 2012-12-10T21:15:58.063 に答える