我已经工作了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?或者当我尝试推送到一个不存在的数组时,为什么不创建数组而不是错误?
我想清楚,虽然这令我感到沮丧,但我对这个问题的目的并不是抱怨。要问我是否做错了。在尝试添加对象/数组之前,我是否真的需要检查对象/数组是否存在的条件?有更好的方法吗?
答案 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
对象上,毫不奇怪,该方法无法在null
或undefined
上运行。几乎每种编程语言都是如此。
在调用data.newObject = {"Name": "Master Sword", "id":2}
时,您确实将属性设置为新对象,这与上述情况完全不同。
答案 2 :(得分:0)
这是因为当您尝试引用对象的键时,如果该键不存在,则该键将被创建,并且将为其分配未定义的值。 undefined只是一个JS Value类型。如果要检查“undefined”不是错误,请注意控制台上的“undefined”是用灰色写的。 (错误有红色)。
如果您将对象分配给其他对象的键,并且您想要向其添加属性,则根本不会出现问题。
但是,如果您尝试向可以使用未定义值初始化的键添加属性,那么您将收到错误消息是合理的。请记住,JS允许您在对象上存储所需的任何值类型。
我建议你阅读更多有关对象和JavaScript中未定义的值。
希望它有所帮助。