0

我正在使用以下代码尝试向 bar 对象添加新属性:

$(document).ready(function(){
    $('form').on("submit",preventDefault);
});

function preventDefault(e) {
    e.preventDefault();
    $url="contact/send";
    bar = $('form').serialize();
    bar["foo"]='xyz';
    //bar.foo="123";
    console.log(bar);
}

但是我似乎从来没有得到 bar.foo 的价值。如果我在 Chrome 中查看控制台,我总是会得到类似这样的结果:

name=Grahame&email=foo%40bar.com&message=Hello.

为什么我没有得到 foo 的值/属性?

4

4 回答 4

1

这里的其他答案谈论如何解决这个问题,但没有人解释为什么会发生这种情况,所以我想我会试一试。

这是后台发生的事情:

  • 你调用.serializewhich 产生一个字符串

  • JavaScript 中的字符串是原始值类型,因此当您向其添加属性时,它“自动装箱”成为该调用的String 引用类型对象

  • 您将属性分配给它,该属性将添加到装箱对象

  • console.log(bar);记录 bar 对象,它已经是一个原始值类型的字符串。既因为 toString 是 String 类型,又因为bar是原始值类型,你得到相同的初始值。

您可以在 JavaScript 中原语的秘密生活中阅读更多相关信息。或者在规范中

如何修复它

请参阅如何向 jQuery 序列化添加值。那里已经回答了。

于 2013-05-23T10:46:55.680 回答
0

你可以使用这个:

bar = $('form').serialize();
bar += '&foo=xyz';
console.log(bar);

目前,您正尝试将其bar用作数组(或注释代码中的对象)。.serialize()实际上会生成一个 URL 编码的字符串,因此您可以简单地将您的值附加到它。

于 2013-05-23T10:45:22.960 回答
0

bar序列化的表单数据。它是一个字符串而不是一个对象。

如果要添加数据,则需要序列化该数据:

bar += "&" + encodeURIComponent('foo') + "=" + encodeURIComponent('xyz');

(如果您知道数据中没有 URL 特殊字符,则可以跳过编码 URI 组件)。

于 2013-05-23T10:45:31.883 回答
0

改成:

bar = $('form').serializeArray();
bar["foo"]='xyz';
于 2013-05-23T10:46:51.507 回答