2

我可能会收到这样的 JSON 结构

foo: {}

或者我可能喜欢这样:

foo: {bar: {baz: 1} }

当我像这样检查第一个数据结构是否存在时:

if ( data.foo.bar.baz ) { }

脚本完全停止运行。我在浏览器或任何东西上看不到任何 javascript 错误。它只是停止。无论哪种方式,能够执行上述操作而不是:

if ( data.foo && data.foo.bar && data.foo.bar.baz ) { }

解决这个问题的最佳方法是什么?

4

3 回答 3

2

假设您不能影响正在使用的 JSON,那么您检查的方式几乎是唯一的方法。虽然我更喜欢检查!== undefined. 这纯粹是我的编程特质,因为我不喜欢考虑if (object)检查object. 我总是将这条线等同于 ,if(object === true)从布尔逻辑的角度来看,这并不是一回事。

if ( data.foo !== undefined && data.foo.bar !== undefined && data.foo.bar.baz !== undefined) { }

您可能可以不检查而侥幸逃脱data.foo !== undefined,因为您说 foo 可能是一个空对象。

如果您的代码将进行大量此类检查,您可以在收到 JSON 数据时预先进行一项检查并填写任何缺失的对象:

if ( data.foo === undefined) data.foo = {};
if ( data.foo.bar === undefined) data.foo.bar = {};
if ( data.foo.bar.baz === undefined) data.foo.bar.baz = null;  // or skip this, I suppose...
于 2013-03-14T04:28:32.047 回答
1

如果您试图在深度嵌套的对象上捕获所有可能的错误,那么您可以使用多个if条件:

 if (data && data.foo && data.foo.bar && data.foo.bar.baz ) { }

或者,如果失败不是预期的情况,您可以使用异常处理程序:

try {
    var item = data.foo.bar.baz;
    // operate on item
} catch(e) {
    // perform any actions when it failed
}

有时,使用单个异常处理程序保护代码块可以大大简化您的错误处理。当异常触发时,异常的性能比if测试差,所以你应该记住这一点,但意外失败通常是异常最擅长处理的,它们有时可以真正简化你的代码的其余部分。

似乎有些开发人员基本上不想编写异常代码,而是更喜欢使用大量if测试,但他们在语言中存在,因为他们非常擅长帮助解决某些类型的问题。

于 2013-03-14T04:29:25.917 回答
0

丑陋、讨厌、可怕的方法是使用evalor 或try..catch. 一种更强大的方法是使用typeof

if (typeof foo != 'undefined' && foo !== Null &&
   typeof foo.bar != 'undefined' && foo.bar !== Null && 
   ... 
) {
    // stuff
}

但是,只有当最终属性的值不是时才有效undefined(即,如果属性存在但具有未定义的值,它将失败)。

您可以创建更准确的通用属性测试器来测试自己的属性:

function testChain(obj) {

    for (var i=1, iLen=arguments.length; i<iLen; i++) {

        if (obj.hasOwnProperty(arguments[i])) {
          obj = obj[arguments[i]];

        } else {
          return false;
        }
    }
    return true;
}

alert( testChain({a:{b:'b'}}, 'a', 'b') ); // true

但这不会检查继承的属性。要检查这些,您可以使用propertyIsEnumerable,但这不会检查不可枚举的属性(例如,内置对象的本机方法)。

所以真的没有通用的解决方案,你只能针对特定情况定制一个。

于 2013-03-14T06:00:09.710 回答