看起来:
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;在意义上更容易辨认和相似.
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)
这是合法的,跨浏览器有效吗?
是的,它适用于所有EcmaScript引擎.然而,(ab)使用短路评估作为if语句是非常罕见的.
我的意思是,jslint说它有错误.我应该无忧无虑地使用它吗?
不,JsLint是对的.这是不寻常和令人困惑的,至少对其他开发人员而言.它看起来太像OR条件 - 但没有"身体".如果你进行赋值,那么变量应该在语句的开头,而不是在某个表达式中.
我真的很喜欢第二个,因为它很短,一行代码
然后用
if (typeof a == 'undefined') a = 0;
Run Code Online (Sandbox Code Playgroud)