为什么JS需要对象/数组存在
Why does JS require object/array to be present
我已经工作了大约六个月左右的时间,所以在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
对象上,不出所料,该方法在 null
或 undefined
上都不起作用。对于几乎所有编程语言来说,这都是相同的。
调用data.newObject = {"Name": "Master Sword", "id":2}
时,实际上是将属性设置为新对象,这与上述情况非常不同。
这是因为当您尝试引用对象的键时,如果该键不存在,则将创建该键,并将未定义的值分配给它。 未定义只是一个 JS 值类型。如果要检查"未定义"不是错误,只需注意"未定义"在控制台上用灰色书写。(错误为红色)。
如果将一个对象分配给其他对象的键,并且想要向其添加属性,则根本不表示问题。
但是,如果您尝试将属性添加到可以使用未定义值初始化的键,那么您将收到错误消息是合理的。请记住,JS允许您在对象上存储所需的任何值类型。
我建议你多读一点关于对象的信息,以及JavaScript中未定义的值。
希望它有帮助。
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 用于检查数组中是否存在元素的javascript自定义方法
- 验证会话中是否存在对象's数组
- 检查数组中是否存在字符串值,并返回找到的数组值js
- underline-js:将键对象与数组键对象进行比较,如果存在,则移除现有的添加新的
- 查找数组's按属性不存在于另一个数组中的对象
- 为什么没有从数组中存在的对象中删除属性
- 在对象上迭代以验证它是否's键存在于数组中
- 使用JQuery检查数组的索引中是否存在字符串
- JavaScript对象中存在数组的问题
- 使用javascript/jquery从现有数组中创建一个新数组,该数组保存项目存在的次数
- undercore返回数组中对象的indes,其中单词存在于对象中的句子中
- 如何使用函数来确定 Javascript 数组中是否存在值
- 如何将多个零推送到已经存在的数组
- 如何获取 JSON 数组下存在的相应值
- 仅当项目没有't存在于数组中
- 正在检查JavaScript中是否存在关联数组
- javascript中的数组和if语句存在问题
- 为什么JS需要对象/数组存在
- 如果数组存在于本地存储中,则返回false