2012-12-10 122 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

相关问题