2015-01-13 20 views
0

我一直在为大概六个月左右的工作角度,所以一直在使用JSON和JavaScript中的对象工作很多。我遇到的这种情况一直令人沮丧,我不明白这个推理。也许这是我对JS的缺乏经验,所以我不知道推理,或者我只是做错了,但我会很感激任何洞察。为什么JS需要对象/数组存在

实例对象:

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

所以,让我们说,我想给一个对象添加到阵列中。很简单,对吧?但是,假设我想在数组存在之前将对象添加到数组中。以上方法出错说出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" 

失败! Cannot set property 'Name' of undefined

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

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

+6

这只是JavaScript的工作方式。您必须先定义一个对象,然后才能设置该对象的属性。你会发现许多编程语言都是这样的... – colti

+0

“我想在数组存在之前将对象添加到数组中”。如果该数组不存在,那么您可以添加什么?我想你已经回答了你自己的问题。 – Andy

+0

@colti所以正在创建条件检查,看看这些数组/对象是否存在最好的/唯一的方法来做到这一点? – Aarmora

回答

2

您正试图通过chaining创建对象。这个问题除了链中的最后一部分之外,所有以前的部分必须已经定义好了。JavascriptObjects

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){}块中的检查部分。

+0

很好的解释和选择,谢谢。 – Aarmora

1

方法push位于javascript Array对象上,不出所料,该方法在nullundefined上都不起作用。几乎所有的编程语言都是一样的。

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

0

这是因为当你试图引用一个对象的键时,如果该键不存在,那么该键将被创建,并且未定义的值将被分配给它。未定义只是一个JS值类型。如果你想检查“未定义”不是错误,只需注意“未定义”在控制台上用灰色书写。 (错误有红色)。

如果您将一个对象分配给其他对象的某个键,并且想要为其添加属性,那么这根本不会代表问题。

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

我建议你多读一点关于对象,以及JavaScript中未定义的值。

希望它有帮助。

相关问题