jquery:用两个对象扩展方法 - 结果是对象对象?

时间:2013-03-24 09:59:41

标签: jquery object extend for-in-loop

我正在jQuery.com上做一些jQuery教程,并尝试立即了解extend方法。它几乎可以工作。

var object1 = {
                apple: 0,
                banana: {weight: 52, price: 100},
                cherry: 97
                };

            var object2 = {
                banana: {price: 200},
                durian: 100
                };

            var obj =   $.extend(object1, object2);

            for(var key in obj) {
                alert('key: ' + key + '\n' + 'value: ' + obj[key]);

警告框提供以下输出:

  • key:apple value:0
  • key:banana value:[object Object]
  • key:cherry value:97
  • key:榴莲值:100

第二个键值对应为banana:200。有人可以解释为什么不是吗?提前谢谢。

5 个答案:

答案 0 :(得分:1)

香蕉是一种物体属性。因此,如果你延长它,它将被第二个替换。但是,如果您要更新priceweight属性,则必须使用此类代码

var obj = $.extend(true, object1, object2);

答案 1 :(得分:0)

香蕉的对象将是:

banana : {
  weight: 52,
  price: 200
}

$.extend不会删除未被覆盖的密钥,它比那更聪明。所以体重仍然存在。

它显示[object object]的原因是因为没有toString()方法且alert不知道如何对香蕉对象进行字符串化。如果您将这些值自己打印到控制台,这就是您将看到的内容。

答案 2 :(得分:0)

警告框不会显示嵌套对象。

//Use this on your object before you alert
alert(JSON.stringify(myObj));

如果您使用Chrome或Firebug,则可以使用console.log(myObj)而非警报轻松查看此输出。您需要在Windows中按Ctrl+Shift+J来查看控制台。

希望这有帮助!

答案 3 :(得分:0)

它显示了对象,因为它是对象,并且它不会深入潜水。

您可以通过添加以下内容轻松测试它:

object2.banana.toString=function (){ return this["price"]; //only for object2's banana. just for demonstrating.

完整代码:http://jsbin.com/esobuc/2/edit

var object1 = {
                apple: 0,
                banana: {weight: 52, price: 100},
                cherry: 97
                };

            var object2 = {
                banana: {price: 200},
                durian: 100
                };

object2.banana.toString=function (){ return this["price"]; 
}

            var obj =   $.extend(object1, object2);

            for(var key in obj) {
              alert('key: ' + key + '\n' + 'value: ' + obj[key]);}

答案 4 :(得分:0)

以下应该有所帮助:

// override banana with its price
object2.banana = object2.banana.price

// merge both objects
var obj = $.extend(object1, object2);