为什么我的JavaScript行可以工作并用“中断JSLint”;意外赋值表达式“;

为什么我的JavaScript行可以工作并用“中断JSLint”;意外赋值表达式“;,javascript,jslint,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] = {} : und

在试图重写一些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;
从来没有想过,因为尽管我现在在揉眼睛,有一次杰斯林特抱怨,但一切都很顺利

所以我的问题是:

为什么它能够正确地设置
target
set
,这是一种糟糕的做法吗?

忽略我在评论中指出的事实,即代码片段实际上并不相等,它之所以能够工作,是因为Javascript解析
x | y
值的方式

在许多语言中,它解析为
true
false
,Javascript将解析为
x
当且仅当
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;
它实际上相当于原始代码片段

  • 如果
    feature.dict_name
    是真实值,则执行赋值
    app[…]={}
    ,这是一个返回其值(
    {}
    )的表达式,并且由于
    {}
    是真实值,
    {}}app
    将解析为
    {}
    ,以使对
    目标的最终赋值生效
  • 否则,您将得到
    undefined | | app
    ,它解析为
    app
    ,因为
    undefined
    是错误的
老实说,就代码质量而言,我认为rewirte只会让事情变得更糟。显然,即使是你,写这本书的人,也无法理解它是如何工作的。为自己节省几行而失去可读性是一个可怕的权衡。我会把它改写成

var target;
if (feature.dict_name) {
  target = app[feature.dict_name] = {};
} else {
  target = app;
}
易于阅读和理解,因此易于维护。事实上,我会为此提取一个函数,实际上可能会添加一行左右


<>我不知道JSLint抱怨什么,但我不需要JSLint告诉你,我确实会考虑你的版本不好的做法。

这两个片段不等价(什么是<代码>特征。StIyOn< <代码>?),但老实说,原始代码比你的要好。我只需要内联
设置
就可以了。你的版本真的很难读。同意。谢谢你的信息。