为什么JS要求对象/数组存在

时间:2015-01-13 17:29:19

标签: javascript

我已经工作了6个月左右的角度,因此在Javascript和javascript中的对象上工作得更多。我遇到的这种情况令人沮丧,我不理解这个推理。也许这是我对JS的经验不足,所以我不知道推理或者说我做错了,但我很欣赏对此的任何见解。

对象示例:

    var data = 
   {  
   "object":
       {  
         "Key":"Value",
         "stuff":"here"
       },
       "array":
       [  
          {  
            "Name":"Pizza Face",
            "id":7
          },
          {  
            "Name":"Maple bar",
            "id":1
          }
       ]
    }

所以,让我们说我想在数组中添加一个对象。容易,对吧?

var newObject = {"Name": "Master Sword", "id":2}
data.array.push(newObject);

但是,我想说我想在数组存在之前将对象添加到数组中。上述方法错误地说Cannot read property 'push' of undefined。相反,我必须围绕它做一个条件。

  var newObject = {"Name": "Master Sword", "id":2}
  if(data.array){
    data.array.push(newObject);
  }
  else{
    data.array = [];
    data.array.push(newObject);
  }

我可以随时向data添加新对象。但是,如果我尝试在对象中添加对象,那么我将面临祸患。

示例:

data.newObject = {"Name": "Master Sword", "id":2}

在这种情况下将创建newObject,每个人都很高兴。

data.newObject.Name = "Master Sword"

FAIL! Cannot set property 'Name' of undefined

那么......为什么JS不只是用布局的键值对创建newObject?或者当我尝试推送到一个不存在的数组时,为什么不创建数组而不是错误?

我想清楚,虽然这令我感到沮丧,但我对这个问题的目的并不是抱怨。要问我是否做错了。在尝试添加对象/数组之前,我是否真的需要检查对象/数组是否存在的条件?有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

您正尝试通过chaining创建对象。问题在于链中的最后一部分,所有先前的部分必须已经定义Javascript Objects

a.b.c.d = new Object(); // a,b,c must be already defined, cannot have cascading here

因此,当您说data.newObject.Name = "Master Sword";时,newObject应该已经定义过了(我已经假设了data个对象。这就是它必须如何工作(可能在至少遵循一些语义的每种语言中)。要解决此类问题,您始终可以创建一个新的通用对象:

var myComplexObject = function() { //add all reusable object constructors here  };

以您喜欢的方式填充复杂对象,例如在此constructor中创建一个新的空对象,并将Prototypes添加到此构造函数以扩展功能。写一次并永远迭代。您可以构建一个适合您要求的库。这就是它应该如何完成的。

P.S。:可能,对于检查部分,您可以封装在try{}catch(e){}块中。

答案 1 :(得分:1)

方法push位于javascript Array对象上,毫不奇怪,该方法无法在nullundefined上运行。几乎每种编程语言都是如此。

在调用data.newObject = {"Name": "Master Sword", "id":2}时,您确实将属性设置为新对象,这与上述情况完全不同。

答案 2 :(得分:0)

这是因为当您尝试引用对象的键时,如果该键不存在,则该键将被创建,并且将为其分配未定义的值。 undefined只是一个JS Value类型。如果要检查“undefined”不是错误,请注意控制台上的“undefined”是用灰色写的。 (错误有红色)。

如果您将对象分配给其他对象的键,并且您想要向其添加属性,则根本不会出现问题。

但是,如果您尝试向可以使用未定义值初始化的键添加属性,那么您将收到错误消息是合理的。请记住,JS允许您在对象上存储所需的任何值类型。

我建议你阅读更多有关对象和JavaScript中未定义的值。

希望它有所帮助。