如何检查一个JavaScript对象是否具有特定属性

4
假设我有一个像这样的JavaScript对象:
window.config
config.UI = {
        "opacity": {
            "_type": "float",
            "_tag": "input",
            "_value": "1",
            "_aka": "opacity",
            "_isShow":"1"
 }

如何判断“opacity”对象是否具有名为“_test”的属性? 例如:
var c=config.ui.opacity;
for(var i in c)
{
   //c[i]=="_test"?
}

我该如何查看它是否已被分配?

1个回答

14

至少有三种方法可以做到这一点;使用哪种方法主要取决于您自己,有时甚至是风格问题,虽然有一些实质性的区别:

if..in

您可以使用 if..in

if ("_test" in config.UI.opacity)

因为当in在测试中使用时(与特殊的for..in循环不同),它会测试对象或其原型(或其原型的原型等)是否具有该名称的属性。

hasOwnProperty

如果你想要排除来自原型的属性(在你的例子中并没有太大关系),你可以使用hasOwnProperty,它是所有对象从Object.prototype继承的函数:

if (config.UI.opacity.hasOwnProperty("_test"))

只需获取它并检查结果

最后,只需检索属性(即使不存在)并通过查看结果决定要执行什么操作;如果您请求对象具有的属性值,但该属性不存在,则会返回undefined

var c = config.UI.opacity._test;
if (c) {
    // It's there and has a value other than undefined, "", 0, false, or null
}
或者
var c = config.UI.opacity._test;
if (typeof c !== "undefined") {
    // It's there and has a value other than undefined
}

防御性编程

如果config.UI可能根本没有opacity属性,你可以更加防御性地处理这些情况:

// The if..in version:
if (config.UI.opacity && "_test" in config.UI.opacity)

// The hasOwnProperty version
if (config.UI.opacity && config.UI.opacity.hasOwnProperty("_test"))

// The "just get it and then deal with the result" version:
var c = config.UI.opacity && config.UI.opacity._test;
if (c) { // Or if (typeof c !== "undefined") {
那个最后一个代码行可行的原因是,在与其他语言相比,JavaScript 中的 && 运算符特别强大;它是奇妙的 ||运算符的必然结果。

刚刚遇到了一个“只是检索它”的问题:如果你深入挖掘一个对象,并且你正在查找的东西的某个父属性未定义,你将会得到一个 TypeError 而不是 'undefined'。 - worc
请参考结尾处 "Being defensive" 下的示例。这正是像 var c = config.UI.opacity && config.UI.opacity._test; 这样的构造所适用的情况。 - T.J. Crowder
这并不是我遇到的确切问题。在我的特定情况下,像{{config}}这样的对象被初始化,但{{UI}}未定义。因此,检查{{UI}}字段{{opacity}}和{{_test}}字段会导致抛出错误,而不是返回undefined - worc
@worc:所以你只需按照我上面展示的方式进行操作:var opacity = config && config.UI && config.UI.opacity; - T.J. Crowder
是的,我知道。我更多地指出了一个陷阱,即不完整的防御会抛出错误而不是返回未定义。 - worc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接