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"也是如此。这是在 Chrome 23 和 Firefox 11 上测试的。

最终发送到jQuery.param函数的对象是从函数的参数构建的,null 是参数的完全有效值。我只是通过构建对象来解决它y : param || '',但我很好奇原生 JS 函数的明显错误,以及为什么'' + null = "null",因为它们通常被认为是两个不同的概念。

4

1 回答 1

3

重载的+运算符在执行其操作之前尝试将两个操作数转换为公共类型。如果任一操作数是字符串,则它将两个操作数都转换为字符串,然后执行字符串连接。

有关操作员的行为,请参见ecmascript+定义:

如果 Type(lprim) 是 String 或 Type(rprim) 是 String,则返回作为连接 ToString(lprim) 后跟 ToString(rprim) 的结果的 String

于 2012-12-10T21:15:58.063 回答