如果变量未定义,则防止出错?

时间:2012-01-18 19:39:32

标签: javascript

我需要用存储在这个对象中的值替换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

我如何运行我的条件,以便在未定义某些内容时不会出错?

5 个答案:

答案 0 :(得分:3)

if (data['results'][res]['entities']['media']["0"] == undefined
    || data['results'][res]['entities']['media']["0"] == null) {

    ...
}

答案 1 :(得分:2)

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

答案 2 :(得分:0)

您可以编写一个遍历对象树的函数,并在遇到未定义的属性时立即返回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"]);

答案 3 :(得分:0)

我知道,这是一个古老的话题。它只是加上我的2美分。 我绝对不是javascript&#34; guru&#34;,但这是我以前的尝试之一。它依赖于一些新的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()
    })
})

有意义吗?

答案 4 :(得分:0)

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

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!’)