今天我正在研究这个项目的问题。 “问题”是我在提供给我的数据中存在一些不确定性,最重要的是我正在构建我的应用程序。这意味着有时可能存在某些值但有时不存在。因为我想在我的上层有一些一致性,所以我写了一些'sanitize'方法来创建我想要的一致性。
但......更好的是什么?:
var myNewData = {};
myNewData['somevalue'] = (myOldData.somevalue) ? myOldData.somevalue : '';
或
var myNewData = {};
myNewData['somevalue'] = myOldData.somevalue || '';
而且......为什么会更好?是性能吗?可读性? 好奇。
编辑: 要清楚。 'somevalue'属性不一定必须在旧数据中。有时它有时不是。
EDIT2: 当然,如果我知道我的旧数据的值包含非字符值(数字,布尔值等),我将默认为它的适当值(0,true等)。
答案 0 :(得分:2)
你应该以可读性为目标,对于这种情况,||
明显胜出。
Javascript中的性能很难预测,因为它可能在不同的实现之间变化很大,有时结果显然完全不合逻辑(正式需要三次查找的东西比需要一次查找的东西更快,因为可能是运行时引擎已经专门针对该代码路径。)
答案 1 :(得分:1)
问题:
myNewData['somevalue'] = myOldData.somevalue || '';
是,如果myOldData.somevalue
保持可接受的假值,你仍然会得到空字符串。
所以,对于第一个,您至少可以进行严格检查以获得更好的控制权:
(myOldData.somevalue !== false) ? myOldData.somevalue : '';
答案 2 :(得分:1)
我认为两者都同样好。
但是,请注意它们仅适用于包含字符串值的地图。如果旧地图包含值false
,null
或0
,则会将其转换为空字符串。
因此,我倾向于选择通用案例:
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)
没有区别。
性能比较?可忽略的。
可读性?你可以自己说,你和你的同事很容易读到什么。我更喜欢较短的一个。
第二个更好,因为你不需要重复相同的事情,并且你将获得错误的机会减少。与此同时,人们不常见,之前使用过静态类型的语言。