【问题标题】:Prevent getting error if variable is undefined?如果变量未定义,防止出错?
【发布时间】:2012-01-18 19:39:32
【问题描述】:

我需要将 imagesrc 替换为该对象中存储的值。但是当我运行时:

if(data['results'][res]['entities']['media']["0"]["media_url"]) {
    imagesrc = data['results'][res]['entities']['media']["0"]["media_url"];
}

我得到错误:

Cannot read property '0' of undefined

如何运行我的条件,以便在某些未定义的情况下不会出错?

【问题讨论】:

标签: javascript


【解决方案1】:
if (data['results'][res]['entities']['media']["0"] == undefined
    || data['results'][res]['entities']['media']["0"] == null) {

    ...
}

【讨论】:

  • 你不需要... == undefined || ... == null。只做其中之一,因为== 在这两种情况下都会返回true
  • try catch 可能会更好地为每个变量执行此操作,使代码看起来很难看。
【解决方案2】:

您可以将代码放在try catch 块中并检查错误消息。

【讨论】:

    【解决方案3】:

    您可以编写一个遍历对象树并在遇到未定义属性时立即返回 undefined 的函数:

    function safeGetData(obj, names)
    {
        for (var i = 0; i < names.length; ++i) {
            if (typeof obj === "undefined") {
                return undefined;
            }
            obj = obj[names[i]];
        }
        return obj;
    }
    

    你可以这样使用它:

    var imagesrc = safeGetData(data,
        ["results", res, "entities", "media", "0", "media_url"]);
    

    【讨论】:

      【解决方案4】:

      我喜欢在这些情况下使用短路评估:

      items && items[val] && doSomething(items[val])
      

      有些人可能会对此感到反感,但我认为这是一种很好且易读的表达方式,仅在满足某些条件时才应评估。

      在这种情况下,我们实际上链接了两个短路评估。首先,我们确定items 是否具有定义值。如果它未定义,那么表达式的其余部分就没有实际意义,所以我们甚至都不会费心去评估它。如果它已定义,那么让我们检查是否存在我们感兴趣的某些属性。如果它未定义,则退出。如果它是真的,我们可以继续计算表达式的其余部分。

      我认为一目了然地推理比:

      if (items) {
         if (items[val]) {
           doSomething(items[val])
         }
      }
      

      三元运算符的工作方式类似:

       items 
           ? items[val] 
               ? doSomething(items[val])
               :  alert(‘The property “‘ + val + ‘“ has not yet been defined.’)
           : alert(‘You have not yet defined any items!’)
      

      【讨论】:

        【解决方案5】:

        这是一个老话题,我知道。这只是添加我的 2 美分。 我绝对不是 javascript “大师”,但这是我的旧尝试之一。它依赖于几个新的 ecmascript 6 功能,并且将以更“实用”的方式解决问题:

        const prop = (...arr) => obj => arr.reduce((acc, v) => acc && acc.hasOwnProperty(v) ? acc[v] : undefined, obj)
        

        以及一些测试以显示它应该如何工作:

        describe('unit - prop', () => {
            const event = {
                    record: {
                        sns: {
                            subject: 'Hello',
                            message: '<div>Welcome!</div>'
                        }
                    }
                }
        
            it('property exists', done => {
                const value = prop('record', 'sns', 'subject')(event)
                expect(value)
                    .to
                    .be
                    .equal('Hello')
                done()
            })
        
            it('property does not exist', done => {
                const value = prop('record', 'bad', 'subject')(event)
                expect(value)
                    .to
                    .be
                    .undefined
                done()
            })
        })
        

        有意义吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-04
          • 1970-01-01
          相关资源
          最近更新 更多