【发布时间】:2016-02-14 00:59:50
【问题描述】:
我目前正在一个大型 Javascript 代码库中工作,代码库中到处都是诉诸流控制异常的代码
function getChecklistUrl() {
try {
return dataLayerObject.config.checklist;
} catch (e) {
try {
console.error('dataLayer', e);
} catch (ignore) {}
}
}
我可能更喜欢条件逻辑,例如相同功能的这种实现
function getChecklistUrl() {
if(typeof dataLayerObject == 'object' &&
'config' in dataLayerObject &&
typeof dataLayerObject.config == 'object' &&
'checklist' in dataLayerObject.config &&
typeof dataLayerObject.config.checklist == 'object') {
return dataLayerObject.config.checklist;
}
return null;
}
虽然后者感觉冗长,但当然可以编写一个辅助函数来减少此类检查的样板文件。
前者是 Javascript 的惯用语吗?后者是否脆弱(跨浏览器/场景)并且最好留给try/catch?还是前者只是懒惰的证据?
编辑
这些对象被假定为“普通”对象,例如var obj = {},所以我认为我不关心这里的原型链。
【问题讨论】:
-
'config' in dataLayerObject如果直接跟在typeof dataLayerObject.config == 'object'后面是多余的(否则是undefined) -
另外,还有一点需要注意,
typeof null === 'object'在 ES5 和下面 -
@Amit 不正确,假设
var dataLayerObject = { config: null };然后'config' in dataLayerObject评估为true,随后检查dataLayerObject.config.something将引发异常... -
@nem 这是一个非常好的观点!
-
你是想只在对象上查找属性,还是在原型链上也一样?从您的代码(通过使用
in)看来,您也在寻找原型方法?