1

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

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

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

或者

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

还有……为什么更好?是性能吗?可读性?只是好奇。

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

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

4

6 回答 6

2

您应该以可读性为目标,并且对于这种情况||显然胜出。

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

于 2012-04-18T07:40:14.617 回答
1

问题在于:

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

就是说,如果myOldData.somevalue持有一个可接受的虚假值,你仍然会得到空字符串。

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

(myOldData.somevalue !== false) ? myOldData.somevalue : '';
于 2012-04-18T07:37:39.360 回答
1

我认为两者都一样好。

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

因此,我倾向于更喜欢通用案例:

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

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

于 2012-04-18T07:38:48.057 回答
1

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

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

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

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

于 2012-04-18T07:40:54.950 回答
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 || "";
    }
}

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

代码 | 空 | 不是空的
      | 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# 程序员会理解它就像他的 ??操作员...

于 2012-04-18T08:16:36.170 回答
0

没有不同。

性能?微不足道。

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

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

于 2012-04-18T07:40:59.273 回答