2016-11-20 34 views
0

过了一会儿写javascript我总是有这个问题。我总是要检查变量存在,然后才能使用它的属性,否则我会得到一个错误。如下面的代码JavaScript使用财产安全,没有得到错误

if (something) { 
    var data = { 
    date: moment() 
    }; 

} 

var x = new F({ 
    param: param, 
    date: data.date || null //<-- still error 
}) 

其中一些变量可能存在或不是,那我肯定不能使用date.date。我必须创建一个新变量来解决这个问题。像

if(data){ date = data.date } 但是有没有更短的解决方案?

+0

date:(data || {})。date || null // < - 没有错误。但看起来不好:D。 –

+0

是的,这是一个问题,但你让它比它所需要的更困难。而不是仅仅有时实例化'data',只是经常做,如果条件通过,添加属性。这样你就不需要防止'数据'被'未定义',你只关心它有或没有的属性。事实上,你不需要'|| null“,因为如果没有'date'属性,你只需要'undefined'。 – vlaz

回答

0

发生这种情况是因为当something的计算结果为false时,可变数据未被定义。在这种情况下,当您尝试访问属性date时,您会收到参考错误。解决的办法是要初始化的数据变量为空对象:

var data = {}; 

if (something) { 
    data.date = moment(); 
} 

var x = new F({ 
    param: param, 
    // now data is defined, so we can safely check if the date property exists on it: 
    date: data.date || null 
}) 

注意,当你真正初始化数据{},防止TypeErrors试图在除对象以外的其他类型的访问属性时,此方法只适用。

+0

'当你尝试访问属性日期时,你会得到一个引用错误.'它是TypeError - 'date'将是'undefined'。 – vlaz

+0

你确定吗?我非常确信,当您尝试使用点符号访问属性时,该脚本将会打破参考错误: '未捕获的ReferenceError:数据未定义。当数据被定义时发生typeError,但不是'Object'类型,而是'null',然后尝试访问它上面的属性。它会说: '未捕获的类型错误:无法读取'空'的属性'日期' –

+0

如果您从不声明数据,就会发生这种情况。但是,由于你有'var data',声明将被悬挂在函数的顶部(并且在'if'之外),所以'data'将会被声明,但是会有'undefined'的值。 – vlaz