2012-12-10 173 views
4

在我們的應用程序中對流氓AJAX請求進行故障診斷時,今天發生了一件奇怪的事情。我們將數據發送回服務器,使用jQuery.param來構建請求字符串。空字符串+ null =「null」?

在一個場景中,餵食給帕拉姆函數的對象有一個空的選擇,所以它看起來是這樣的:

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

此代碼實際上是埋在骨幹集,但原理是一樣的。現在

,我完全被震驚了參數,當服務器接收,該變量y是文字字符串"null",而不是null

一些挖後,我發現encodeURIComponent(null)返回字符串"null"和更有趣'' + null產生"null"爲好。這是在Chrome 23和Firefox 11上測試的。

最終被髮送到jQuery.param函數的對象從參數構建到函數,而null是參數的完全有效值。我用y : param || ''構建對象來解決這個問題,但我很好奇原生JS函數的明顯錯誤,以及爲什麼'' + null = "null",因爲它們通常被認爲是兩個不同的概念。

+5

http://stackoverflow.com/a/10362142/362536 – Brad

+0

由於@Brad。這在我的任何搜索中都沒有顯示出來。有趣的編程背後的例子,雖然我猜這個決定必須在做類型轉換時做出來 –

+0

我會考慮'jQuery.param'中的一個錯誤。 '{foo:'bar'}'應該變成'?foo = bar','{foo:''}'應該變成'?foo =','{foo:null}'變成'?foo' 。 – zzzzBov

回答

3

重載+操作者試圖執行其操作前兩個操作數轉換成常見的類型。如果任一操作數是一個字符串,它將兩個操作數轉換爲一個字符串,然後執行字符串連接。

ecmascript定義爲+運營商的行爲:

如果Type(lprim)是字符串或類型(rprim)是字符串,然後 返回字符串是串聯的ToString的結果( lprim),隨後的ToString(rprim)

+0

這就是爲什麼encodeURIComponent以同樣的方式工作?它在其末尾隱式地加入字符串? –

+0

,並且我知道發生了類型轉換,我只是沒有想到在發生這種情況時將'null'轉換爲''null'' –

+2

EcmaScript規範(第15.1.3.4節)指定encodeURIComponent()的第一件事是將它的參數轉換爲一個字符串。因此'null'變成「null」 – broofa

相關問題