我应该使用 if-then-else 或 and or 运算符来检查 Javascript 中的空值吗?
Should I use if-then-else or and or operator to check for empty values in Javascript
今天这个问题出现在我正在从事的项目上。"问题"是我在提供给我的数据中有一些不确定性,我正在构建我的应用程序。这意味着某些值有时存在,但有时不存在。因为我想要在我的上层有一些一致性,所以我写了一些"清理"方法来创建我想要的一致性。
但。。。什么更好?
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
是一个对象。 如果是字符串或数字,这里可能会发生不好的事情。 (无端括号总是一个好主意。
我认为两者都同样好。
但是,请注意它们仅适用于包含字符串值的映射。如果旧映射包含值false
、null
或0
,它们将被转换为空字符串。
因此,我倾向于通用情况:
myNewData['somevalue'] = (myOldData.somevalue != undefined) ? myOldData.somevalue : '';
但是,如果您只处理字符串,那么简短的myOldData.somevalue || ''
对我来说看起来简洁明了。
没有区别。
性能?微不足道。
可读性?你可以自己说,什么很容易读给你和你的同事听。我更喜欢更短的。
第二个更好,因为您不需要重复同样的事情,并且出错的可能性更小。同时对于以前使用静态类型语言的人来说并不常见。
- 使用javascript检查多个输入值,并在1次检查中标记多个输入框
- JavaScript 检查隐藏字段中的值并将其设置为隐藏字段值
- 如何使用javascript检查移动sd卡中是否存在文件
- 使用javascript检查服务器上是否存在html文件
- javascript检查对象存在
- 如何使用Javascript检查当前鼠标按钮状态
- Javascript检查图像是否在数组中
- JavaScript检查某些文本中的许多关键字
- 如何使用JavaScript检查HTML表中插入的值的类型
- Javascript检查参数是否为零值
- Javascript检查表单的当前数据是否等于其原始数据
- JavaScript:检查变量是否等于两个或多个值之一的简单方法
- 使用JavaScript检查用户名是否已存在于SQLite中
- 如何使用javascript检查事件是否应用于元素
- Javascript-检查是否设置了cookie
- 使用 javascript 检查文本框是否以 92 开头
- 使用 Javascript 检查文本区域值是否为数字
- 使用 javascript 检查元素是否包含子标记而不是文本
- Javascript 检查范围是否重叠
- JavaScript - 检查 JSON 中是否有特定键可用