与可能不存在的属性进行比较

时间:2016-06-12 21:25:05

标签: javascript properties boolean undefined

我的背景更多是强类型语言而不是,所以我会事先声明我对以不经意的方式处理未定义对象有偏见。也就是说,我正在考虑一个简单的问题,即为变量赋值布尔值,其中所述布尔值来自某个对象的属性,而对象将始终存在,但该属性可能不存在。

这听起来比实际更复杂。看一看。我们首先在代码的早期启动一些对象,涵盖三种可能的场景:

var object1 = {};
object1.IsDisplayed = true;
var object2 = {};
object2.IsDisplayed = false;
var object3 = {};
// notice we do *not* create the IsDisplayed property here

稍后我们调用带有单个参数的process()函数。我们称之为基线解决方案A.

解决方案A

这是JavaScript,它实际上与object1,object2和object3一样有效。但它似乎对我有一点代码味道;目前尚不清楚作者是否考虑过可能不存在的财产。

function process(renderedItem) {
    var rendered = renderedItem.IsDisplayed;
    if (rendered) {
        // do some stuff here
    }
}

我认为有两种方法可以使其更加强大:

解决方案B

我喜欢这个解决方案,因为即使是最随意的读者也能够正确地考虑未定义的情况,它既健壮又清晰。在缺点方面它是罗嗦的,不像解决方案C那么紧凑,它使用属性的字符串名称,我对此非常厌恶。

function process(renderedItem) {
    var rendered = renderedItem.hasOwnProperty('IsDisplayed')
        ? renderedItem.IsDisplayed
        : false;
    if (rendered) {
        // do some stuff here
    }
}

解决方案C

我喜欢这种解决方案,因为它坚固而紧凑;它明确地考虑了可能不存在的财产;然而,它并不像解决方案B那么明显。我记得很早就读过一些同事的代码和思考,“到底是什么?”并建议删除=== true作为冗余。此外,它仍然在技术上引用了一个未定义的值(在传入object3的情况下)。

function process(renderedItem) {
    var rendered = renderedItem.IsDisplayed === true;
    if (rendered) {
        // do some stuff here
    }
}

这三种变体中是否有明确的“最佳实践”?

0 个答案:

没有答案