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

Why does JS require object/array to be present

本文关键字:数组 存在 对象 JS 为什么      更新时间:2023-09-26

我已经工作了大约六个月左右的时间,所以在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);

但是,假设我想在数组存在之前将对象添加到数组中。 上面的方法错误地说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? 或者当我尝试推送到不存在的数组时,为什么不直接创建数组而不是错误?

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

您正在尝试通过 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以扩展功能。写一次,永远迭代。您可以构建适合您需求的库。这就是应该这样做的方式。

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

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

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

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

如果将一个对象分配给其他对象的键,并且想要向其添加属性,则根本不表示问题。

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

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

希望它有帮助。