我应该使用if-then-else或和运算符来检查Javascript中的空值

时间:2012-04-18 07:30:35

标签: javascript performance if-statement readability or-operator

今天我正在研究这个项目的问题。 “问题”是我在提供给我的数据中存在一些不确定性,最重要的是我正在构建我的应用程序。这意味着有时可能存在某些值但有时不存在。因为我想在我的上层有一些一致性,所以我写了一些'sanitize'方法来创建我想要的一致性。

但......更好的是什么?:

var myNewData = {};
myNewData['somevalue'] = (myOldData.somevalue) ? myOldData.somevalue : '';

var myNewData = {};
myNewData['somevalue'] = myOldData.somevalue || '';

而且......为什么会更好?是性能吗?可读性? 好奇。

编辑: 要清楚。 'somevalue'属性不一定必须在旧数据中。有时它有时不是。

EDIT2: 当然,如果我知道我的旧数据的值包含非字符值(数字,布尔值等),我将默认为它的适当值(0,true等)。

6 个答案:

答案 0 :(得分:2)

你应该以可读性为目标,对于这种情况,||明显胜出。

Javascript中的性能很难预测,因为它可能在不同的实现之间变化很大,有时结果显然完全不合逻辑(正式需要三次查找的东西比需要一次查找的东西更快,因为可能是运行时引擎已经专门针对该代码路径。)

答案 1 :(得分:1)

问题:

myNewData['somevalue'] = myOldData.somevalue || '';

是,如果myOldData.somevalue保持可接受的假值,你仍然会得到空字符串。

所以,对于第一个,您至少可以进行严格检查以获得更好的控制权:

(myOldData.somevalue !== false) ? myOldData.somevalue : '';

答案 2 :(得分:1)

我认为两者都同样好。

但是,请注意它们仅适用于包含字符串值的地图。如果旧地图包含值falsenull0,则会将其转换为空字符串。

因此,我倾向于选择通用案例:

myNewData['somevalue'] = (myOldData.somevalue != undefined) ? myOldData.somevalue : '';

但是,如果您只处理字符串,那么短myOldData.somevalue || ''看起来简洁明了。

答案 3 :(得分:1)

如果myOldData.someValue为falsey(null,undefined,0,''等),两者都将产生'',但第一个很容易发生复制/粘贴错误。尽可能使用第二种形式,并且在将所有可疑答案合并到您的默认值时是可以容忍的。

请注意,如果基础对象 - myOldData - 可能为null或未定义,则它是一个完全不同的球类游戏,您需要执行以下操作:

myNewData.somevalue = ( myOldData && myOldData.someValue ) || '';

这假设myOldData是一个对象。如果它是一个字符串或数字,那么可能会发生不好的事情。 (而无端的括号总是一个好主意。)

答案 4 :(得分:1)

我针对此说明进行了性能测试:

myNewData['somevalue'] = (myOldData.somevalue) ? myOldData.somevalue : ''
myNewData['somevalue'] = (myOldData.somevalue) || ''

作为奖励 if

if (myOldData.somevalue)
    myNewData['somevalue'] = myOldData.somevalue
else
    myNewData['somevalue'] = '';

myOldData.somevalue是否为空。对于这样的测试:

for (i = 0; i < 10; ++i) {
    for (j = 0; j < 100000000; ++j) {
        result = empty || "";
    }
}

外循环是计算平均值(省略定时代码)。这些是我的结果(指数越低表现越好):

Code  |   Empty               |     Not Empty
      |   IE9        CHROME   |     IE9        CHROME
------------------------------------------------------
?:    |   1435.1     551.1    |     1636.1     706.1
||    |   1450.3     488      |     1623.7     706.4
if    |   1436.2     491      |     1642.6     653.6
------------------------------------------------------

所以我觉得表演不是这里的重点(无论如何,更好的测试应该检查一下,如果要测试的变量更复杂的话)。

可读性是一种非常基于意见的东西。我个人更喜欢||,因为它足够清晰而且更短但是如果你选择一个C程序员,也许他不会喜欢它,而C#程序员会理解它就像他的 ??运营商......

答案 5 :(得分:0)

没有区别。

性能比较?可忽略的。

可读性?你可以自己说,你和你的同事很容易读到什么。我更喜欢较短的一个。

第二个更好,因为你不需要重复相同的事情,并且你将获得错误的机会减少。与此同时,人们不常见,之前使用过静态类型的语言。