为什么我的JavaScript行可以工作并用“中断JSLint”;意外赋值表达式“;
在试图重写一些JavaScript时,一天深夜,我转换了以下内容:为什么我的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
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
var target;
if (feature.dict_name) {
target = app[feature.dict_name] = {};
} else {
target = app;
}
易于阅读和理解,因此易于维护。事实上,我会为此提取一个函数,实际上可能会添加一行左右
<>我不知道JSLint抱怨什么,但我不需要JSLint告诉你,我确实会考虑你的版本不好的做法。这两个片段不等价(什么是<代码>特征。StIyOn< <代码>?),但老实说,原始代码比你的要好。我只需要内联
设置就可以了。你的版本真的很难读。同意。谢谢你的信息。