【问题标题】:Why is my JavaScript line working and breaking JSLint with "Unexpected assignment expression"为什么我的 JavaScript 行正常工作并使用“意外的赋值表达式”破坏 JSLint
【发布时间】:2014-04-12 10:55:09
【问题描述】:

在尝试重写一些 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,这是不是很糟糕的做法?

【问题讨论】:

  • 这两个 sn-ps 不等价(feature.set_on 是什么?),但老实说原始代码比你的要好。我会简单地内联set 并完成它。你的版本真的很难读。

标签: javascript jslint


【解决方案1】:

忽略我在评论中指出的 sn-ps 确实不相等的事实,它起作用的原因在于 Javascript 解析 x || y 的值的方式。

虽然在许多语言中它解析为true 或false,但当且仅当x 为真时,Javascript 会将其解析为x,否则解析为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;

它确实相当于原来的 sn-p。

  • 如果feature.dict_name 为真值,则执行app[...] = {} 赋值,这是一个返回其值的表达式 ({}),因为{} 是一个真值,{} || app 将解析为{}完成target 的最终分配工作。
  • 否则,您会得到undefined || app,它会解析为app,因为undefined 是虚假的。

老实说,就代码质量而言,我认为重写只会让事情变得更糟。显然,即使是编写它的你也无法理解它是如何工作的。为自己节省几行代码并失去可读性反而是一个可怕的权衡。我会把它改写成

var target;
if (feature.dict_name) {
  target = app[feature.dict_name] = {};
} else {
  target = app;
}

它易于阅读和理解,因此易于维护。事实上,我会为此提取一个函数,实际上可能会添加一行左右。

我不知道 JSLint 抱怨什么,但我不需要 JSLint 告诉你我确实认为你的版本是不好的做法。

【讨论】:

  • 同意。感谢您的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2019-09-03
  • 2011-03-03
  • 2014-08-17
  • 2020-06-08
  • 1970-01-01
相关资源
最近更新 更多