为什么我的JavaScript行工作并使用“意外的赋值表达式”破坏JSLint

时间:2014-04-12 10:55:10

标签: javascript jslint

在尝试重写一些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抱怨我现在都在揉眼睛,但一切都很好。

所以我的问题
为什么它可以正常设置targetset,这是不是很糟糕的做法?

1 个答案:

答案 0 :(得分:2)

忽略我在评论中指出的事实,即片段确实不相同,其工作原因在于Javascript解析x || y的值的方式。

虽然在许多语言中它都会解析为truefalse,当且仅当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告诉你我确实会考虑你的版本不好的做法。