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

Javascript 为什么JS要求对象/数组存在,javascript,Javascript,我已经在angular上工作了大约六个月,因此在javascript中更多地使用JSON和对象。我遇到的这种情况令人沮丧,我不明白其中的道理。可能是因为我对JS缺乏经验,所以我不知道原因,也可能是我做错了,但我希望能对此有所了解 对象示例: var data = { "object": { "Key":"Value", "stuff":"here" }, "array": [

我已经在angular上工作了大约六个月,因此在javascript中更多地使用JSON和对象。我遇到的这种情况令人沮丧,我不明白其中的道理。可能是因为我对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);

但是,假设我想在数组存在之前将对象添加到数组中。上面的方法错误地指出,
无法读取未定义的
的属性“push”。取而代之的是,我必须在它周围附加一个条件

  var newObject = {"Name": "Master Sword", "id":2}
  if(data.array){
    data.array.push(newObject);
  }
  else{
    data.array = [];
    data.array.push(newObject);
  }
我可以随时向
数据添加新对象。然而,如果我试图在一个对象中添加一个对象,我就有祸了

例如:

data.newObject = {"Name": "Master Sword", "id":2}
在这种情况下,将创建新对象,每个人都很高兴

data.newObject.Name = "Master Sword"
失败<代码>无法设置未定义的属性“名称”

那么…为什么JS不使用布局好的键值对创建新对象呢?或者,当我尝试推送到一个不存在的数组时,为什么不创建该数组而不是出错


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

方法
push
位于javascript
数组
对象上,因此该方法不适用于
null
未定义
。这几乎适用于所有编程语言


调用
data.newObject={“Name”:“Master Swarm”,“id”:2}
您实际上是在将属性设置为一个新对象,这与上面的情况截然不同。

方法
推送
位于一个javascript
数组
对象上,毫不奇怪,该方法在
null
undefined
上都不起作用。这几乎适用于所有编程语言


调用
data.newObject={“Name”:“Master Swarm”,“id”:2}
您实际上是在将属性设置为一个新对象,这与上面的情况截然不同。

方法
推送
位于一个javascript
数组
对象上,毫不奇怪,该方法在
null
undefined
上都不起作用。这几乎适用于所有编程语言


调用
data.newObject={“Name”:“Master Swarm”,“id”:2}
您实际上是在将属性设置为一个新对象,这与上面的情况截然不同。

方法
推送
位于一个javascript
数组
对象上,毫不奇怪,该方法在
null
undefined
上都不起作用。这几乎适用于所有编程语言


当调用
data.newObject={“Name”:“Master Swarm”,“id”:2}
时,您实际上是在将属性设置为一个新对象,这与上述情况完全不同。

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

如果您将一个对象分配给另一个对象的键,并且希望向其添加属性,那么这根本不代表问题

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

我建议您阅读更多关于对象的内容,以及JavaScript中未定义的值


希望有帮助。

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

如果您将一个对象分配给另一个对象的键,并且希望向其添加属性,那么这根本不代表问题

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

我建议您阅读更多关于对象的内容,以及JavaScript中未定义的值


希望有帮助。

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

如果您将一个对象分配给另一个对象的键,并且希望向其添加属性,那么这根本不代表问题

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

我建议您阅读更多关于对象的内容,以及JavaScript中未定义的值


希望有帮助。

这是因为当您尝试引用对象的键时,如果该键不存在,则该键将被创建,未定义的值将被分配
a.b.c.d = new Object(); // a,b,c must be already defined, cannot have cascading here
var myComplexObject = function() { //add all reusable object constructors here  };