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

Should I use if-then-else or and or operator to check for empty values in Javascript

本文关键字:Javascript 检查 空值 运算符 if-then-else or and 我应该      更新时间:2023-09-26

今天这个问题出现在我正在从事的项目上。"问题"是我在提供给我的数据中有一些不确定性,我正在构建我的应用程序。这意味着某些值有时存在,但有时不存在。因为我想要在我的上层有一些一致性,所以我写了一些"清理"方法来创建我想要的一致性。

但。。。什么更好?

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

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

和。。。为什么更好?是性能吗?可读性?只是好奇。

编辑:需要明确的是。"somevalue"属性不一定必须位于旧数据中。有时是,有时不是。

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

你应该以可读性为目标,在这种情况下,||显然是赢家。

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

我为此说明运行了性能测试:

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 || "";
    }
}

外循环是计算平均值(省略时序码)。这些是我的结果(较低的索引更好的性能):

代码 |  空 |    不为空      |  IE9 铬 |    IE9 铬------------------------------------------------------?:    |  1435.1 551.1 |    1636.1     706.1||   |  1450.3 488 |    1623.7     706.4如果 |  1436.2 491 |    1642.6     653.6------------------------------------------------------

所以我想性能不是这里的重点(无论如何,一个更好的测试应该检查如果要测试的变量是更复杂的变量怎么办)。

可读性是非常基于意见的。就我个人而言,我更喜欢||因为它足够清晰和简短,但如果你选择一个 C 程序员,也许他不会喜欢它,而 C# 程序员会明白这就像他的??运算符......

问题与:

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

就是这样,如果myOldData.somevalue持有可接受的 falsy 值,您仍然会得到空字符串。

因此,对于第一个,您至少可以进行严格的检查以更好地控制:

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

如果 myOldData.someValue 为 falsey(null、undefined、0、'' 等),则两者都会生成 '',但第一个非常容易受到复制/粘贴错误的影响。 尽可能使用第二种形式,并且将所有错误答案合并到默认值时是可以容忍的。

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

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

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

我认为两者都同样好。

但是,请注意它们仅适用于包含字符串值的映射。如果旧映射包含值falsenull0,它们将被转换为空字符串。

因此,我倾向于通用情况:

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

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

没有区别。

性能?微不足道。

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

第二个更好,因为您不需要重复同样的事情,并且出错的可能性更小。同时对于以前使用静态类型语言的人来说并不常见。