我正在研究一个动态结构,作为一个基本的例子:
var myObj = {
"fruits" : {
"apples" : {
"color" : "red",
"price" : "$0.49"
}
},
"colors" : {}
};
所以我期待例如水果,“橘子”不存在。我想测试它不存在,所以我可以添加它。
我在控制台中看到,如果您尝试访问不存在的“对象”,则会被告知“未定义”。
这就是我正在寻找的但我不想在控制台中出现错误,我想知道/预计它是空的,所以我可以添加它。
如果我做的话
console.log(myObj.fruits.apples.color);
我会变红,所以如果我这样做是橙色的
console.log(myObj.fruits.orange.color);
它会说未定义,至少如果我尝试
console.log(myObj.fruits.apples.weight);
那应该是未完成的,我的jsfiddle没有这么热,我现在无法重现那个未定义的console.log消息
好的,所以看来如果对象存在,你可以测试一个未定义的属性,比如上面的权重例。
我不是在寻找,我正在测试是否存在像“椰子”这样的对象,所以我可以使用extend将它添加到对象数组中。但是我不希望红色控制台日志错误,我希望能够使用比较来预测它:
if (myObj.fruits.coconut === "undefined") {
// means it doesn't exist, add it
}
我通过自己的测试意识到,这会产生错误,而不是像上面的苹果重量控制台日志演示那样未定义
答案 0 :(得分:1)
您应该检查可能不存在的 first 属性:因此,在确定coconut.color
存在之前,请不要检查coconut
属性。
如果您检查的属性应该是一个对象(这是您的情况),那么您可以使用!
运算符执行此操作:
if (!myObj.fruits.coconut) myObj.fruits.coconut = { color: 'brown' };
答案 1 :(得分:0)
如果您想测试对象上是否存在属性,可以使用Object.prototype.hasOwnProperty()
:
myObj.fruits.hasOwnProperty("apples") //true
myObj.fruits.hasOwnProperty("oranges") //false
答案 2 :(得分:0)
正如有人在评论中指出的那样,你至少有两种方式。
第一个,最简单的,就是做
if(!myObj.fruits.cononut)
// do stuff
然而,这并不是非常安全,因为即使.coconut
为false
,"仍会填充" 。
人们通常做的是
if(typeof myObj.fruits.cononut === "undefined")
// do stuff
检查字段是否实际上不存在且未设置(===
也检查相同的类型)。
但是,这次我觉得你可以试试这个(没有深入测试):
if(!("cononut" in myObj.fruits))
// do stuff
检查钥匙是否存在。
修改强>
正如@hackerrdave指出的那样,你也可以使用.hasOwnProperty
方法。
答案 3 :(得分:0)
下划线js包含 _。有 link
_。有(对象,键) 对象是否包含给定的键?与object.hasOwnProperty(key)相同,但是如果它被意外覆盖,则使用对hasOwnProperty函数的安全引用。
_.has({a: 1, b: 2, c: 3}, "b");
=> true
显然,hackerrdave回答就足够了,但是如果你使用了下划线,那么它就会稍微简单一些。