我正在使用以下代码尝试向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的值/属性?
答案 0 :(得分:1)
其他答案在这里谈论如何解决这个问题,但没有人在解释为什么这种情况正在发生,所以我想我会试一试。
您调用生成字符串的.serialize
JavaScript中的字符串是原始值类型,因此当您向其添加属性时,“autoboxes”将成为该调用的String
引用类型对象。
您将属性分配给它,该属性将添加到装箱对象
console.log(bar);
记录bar对象,该对象已经是一个原始值类型的字符串。因为String类型的toString,并且因为bar
是原始值类型,所以你得到相同的初始值。
您可以在the secret life of primitives in JavaScript.或the specification
中详细了解相关信息答案 1 :(得分:0)
你可以使用它:
bar = $('form').serialize();
bar += '&foo=xyz';
console.log(bar);
目前,您尝试将bar
用作数组(或注释代码中的对象)。 .serialize()
实际上会生成一个URL编码字符串,因此您只需将值附加到其中即可。
答案 2 :(得分:0)
bar
是序列化表单数据。它是字符串而不是对象。
如果要添加数据,则需要序列化该数据:
bar += "&" + encodeURIComponent('foo') + "=" + encodeURIComponent('xyz');
(如果您知道数据中没有网址特殊字符,则可以跳过编码URI组件。)
答案 3 :(得分:0)
更改为:
bar = $('form').serializeArray();
bar["foo"]='xyz';