在尝试重写一些JavaScript时,一个晚(晚),我转换了这个:
var set = feature.dict_name;
var target;
if (set) {
target = app[feature.dict_name] = {};
} else {
target = app;
}
进入这个:
var target = (feature.set_on? app[feature.dict_name] = {} : undefined) || app;
并且从未想过,因为虽然JSLint抱怨我现在都在揉眼睛,但一切都很好。
所以我的问题:
为什么它可以正常设置target
和set
,这是不是很糟糕的做法?
答案 0 :(得分:2)
忽略我在评论中指出的事实,即片段确实不相同,其工作原因在于Javascript解析x || y
的值的方式。
虽然在许多语言中它都会解析为true
或false
,当且仅当x
真实时,Javascript才会将其解析为x
,并{{1否则。
以下是一些例子:
y
假设你实际上意味着以下单行
console.log( 5 || 10 ); // 5, because 5 is truthy
console.log( 0 || 10 ); // 10, because 0 is falsy and 10 is truthy
console.log( 0 || 0 ); // 0
console.log( 0 || "" ); // ""
它确实等同于原始代码段。
var target = (feature.dict_name ? app[feature.dict_name] = {} : undefined) || app;
是真实的,则执行作业feature.dict_name
,这是一个返回其值(app[...] = {}
)的表达式,因为{}
是一个真值,{ {1}}将解析为{}
以完成对{} || app
工作的最终作业。{}
会解析为target
,因为undefined || app
是假的。在代码质量方面,我认为回归只会让事情变得更糟,说实话。显然,即使你写了它,你也能理解它是如何工作的。拯救自己几行并失去可读性是一种可怕的权衡。我会把它重写为
app
易于阅读和理解,因此易于维护。事实上,我会为此提取一个函数,实际上可能会添加一行左右。
我不知道JSLint抱怨什么,但我不需要JSLint告诉你我确实会考虑你的版本不好的做法。