Javascript:|| 而不是IF声明 - 这是合法的和跨浏览器有效吗?

Tam*_*Pap 33 javascript

看起来:

if (typeof a == 'undefined') {
    a = 0;
}
Run Code Online (Sandbox Code Playgroud)

(typeof a != 'undefined') || (a = 0)
Run Code Online (Sandbox Code Playgroud)

在Javascript中具有相同的效果.

我真的很喜欢第二个,因为它很短,一行代码,但这是合法的,跨浏览器有效吗?我的意思是,jslint说它有错误.我应该无忧无虑地使用它吗?

Tom*_*icz 76

恕我直言|| (a = 0),太过类似|| (a == 0),因而令人困惑.有一天过分热心的开发人员只会" 修复它 ",改变代码的含义.每个其他开发人员都必须坐一会儿才能弄清楚这是你的意图还是一个简单的bug.

这实际上是JSLint试图说的:

期望一个条件表达式,而是看到一个赋值.

我避免使用混乱的结构,因为它们会损害可读性.a = a || 0;在意义上更容易辨认和相似.

  • `a = a || 0`不一样.你正在为'false`和`null`得到0,这可能不是OP想要的. (7认同)
  • 顺便提一下a = a || 当a为0时,0将有点无意义,因为0是假的,因此a将被重置为零. (4认同)

Nor*_*ard 31

为什么不是更简单的东西,比如:

a = a || 0;
Run Code Online (Sandbox Code Playgroud)

要么

a = a ? a : 0;
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您还可以清楚地看到正在分配的内容a,就在行的开头,而不是通过阅读整个内容,并确定是否有任何改变游戏规则的函数 - 调用左侧或右侧......或者弄清楚双方的行为,一般来说,决定可能存在多少程序范围的潜在变化.

如果你需要包括整个类型检查,它仍然不是那么大.

a = (typeof a !== "undefined") ? a : 0;  // [parentheses are there for clarity]
Run Code Online (Sandbox Code Playgroud)

  • 短版本不是a = a || 0,但是cond || a = 0.表现得好像(cond){a = 0}; 如果条件为真,您只执行赋值*.只要条件为假,另一个版本将执行赋值a = a,这是浪费. (2认同)

Ber*_*rgi 9

这是合法的,跨浏览器有效吗?

是的,它适用于所有EcmaScript引擎.然而,(ab)使用短路评估作为if语句是非常罕见的.

我的意思是,jslint说它有错误.我应该无忧无虑地使用它吗?

不,JsLint是对的.这是不寻常和令人困惑的,至少对其他开发人员而言.它看起来太像OR条件 - 但没有"身体".如果你进行赋值,那么变量应该在语句的开头,而不是在某个表达式中.

我真的很喜欢第二个,因为它很短,一行代码

然后用

if (typeof a == 'undefined') a = 0;
Run Code Online (Sandbox Code Playgroud)

  • 这是一个大世界.对于shell脚本和perl程序员来说,使用短路评估作为if语句并不罕见.我不确定我同意Javascript应该看起来像C的假设. (2认同)