【问题标题】:Why can't I append to my JSON object? (jQuery/Javascript)为什么我不能附加到我的 JSON 对象? (jQuery/Javascript)
【发布时间】:2013-05-23 10:42:51
【问题描述】:

我正在使用以下代码尝试向 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 的值/属性?

【问题讨论】:

    标签: javascript jquery json


    【解决方案1】:

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

    这是在后台发生的事情:

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

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

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

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

    您可以在the secret life of primitives in JavaScript.the specification 中阅读更多相关信息

    如何解决

    How to add a value to jQuery serialize。那里已经回答了。

    【讨论】:

      【解决方案2】:

      你可以用这个:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

          改为:

          bar = $('form').serializeArray();
          bar["foo"]='xyz';
          

          【讨论】:

            猜你喜欢
            • 2011-02-02
            • 2020-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多