Javascript:|| 而不是IF声明 – 这是合法的,跨浏览器有效吗?
看起来:
if (typeof a == 'undefined') { a = 0; }
和
(typeof a != 'undefined') || (a = 0)
在Javascript中具有相同的效果。
我真的很喜欢第二个,因为它是短的,一行代码,但这是合法的,跨浏览器有效? 我的意思是,jslint说它有错误。 我应该使用它没有担忧?
恕我直言|| (a = 0)
|| (a = 0)
与|| (a == 0)
太相似了 || (a == 0)
,从而混淆。 有一天,过分热心的开发人员只会“ 修复它 ”,改变你的代码的含义。 而每个其他的开发者都需要坐一段时间才能确定这是你的意图还是一个简单的错误。
这实际上是JSLint想要说的:
期望一个条件expression式,而是看到一个任务。
我避免使用混淆构造,因为它们伤害了可读性。 a = a || 0;
在意义上是更可识别和相似的。
为什么不是更简单的东西,比如:
a = a || 0;
要么
a = a ? a : 0;
在这两种情况下,你也可以清楚地看到,在开始的时候,有一些东西被分配给a
,而不是诉诸整个事情,并且确定是否有任何改变游戏规则的function无论是左边还是右边……或者弄清楚双方做什么,一般来说,要决定可能有多less潜在的全方位变化。
如果你需要包括整个types检查,它仍然不是那么大。
a = (typeof a !== "undefined") ? a : 0; // [parentheses are there for clarity]
这是合法的,跨浏览器有效吗?
是的,它可以在所有的EcmaScript引擎中工作。 但是,(b)使用短路评估作为if语句是非常罕见的。
我的意思是,jslint说它有错误。 我应该使用它没有担忧?
不,JsLint是对的。 至less对其他开发者来说,这是非常不寻常的和混乱的。 它看起来太像一个OR条件 – 但没有“身体”。 如果你做了任务,variables应该在语句的开头,而不是在某个expression式中。
我真的很喜欢第二个,因为它很短,一行代码
然后使用
if (typeof a == 'undefined') a = 0;
您可以使用:
a = typeof(a) !== "undefined" ? a : 0;
在风格上,设置像a || a=default
一样a || a=default
默认值 a || a=default
是进入函数的常用习惯用法,因为javascript不强制参数的数目。
如果在其他情况下使用这种构造,那么可读性将会受到影响。
性能用于不同风格之间的变化,但在今天的快速testing中,如果/ else和逻辑运算符是相同的速度,但三元运算速度较慢。
请问为什么你更喜欢一行代码?
作为一个人,我更喜欢可读的代码。 我的机器喜欢短而快的代码(易于加载和执行)。
今天像UglifyJS这样的缩小机构知道如何缩短代码,所以你可以同时拥有这两个,你不需要担心这个细节。 我把你的代码给了UglifyJS,输出如下:
typeof a=="undefined"&&(a=0)
你可以在这里试试看:
http://marijnhaverbeke.nl/uglifyjs
[更新]我的个人偏好(再次考虑到可读性)是在有select时使用,|| 为后备。 你的具体例子似乎是一个后备(如果一个不存在或未定义,然后分配给值0),所以我会使用||。 正如我在评论中所说的,在variablesa还没有被声明的情况下(我不知道你的上下文),(var a = 0)对我更有意义。
我认为使用这样的结构是非常糟糕的。 它工作,但代码不可读。 如果你想写一行条件,你可以开始使用CoffeeScript,并写:
a = 0 if (typeof a == 'undefined');
在你的情况下,当你在条件和赋值中有一个variables时,使用一行javascript三元运算符:
a = (typeof a == 'undefined') ? 0 : a;
(typeof a != 'undefined') || (a = 0)
是一个expression。 但是它的一个子expression
(a = 0)
是一项任务。 所以基本上,这是一个副作用的expression。 声明(特别是那些有效的声明),有副作用,通常是你在学习编程课程时不要做的第一件事情。 那么为什么只是因为它只需要一条线呢?
我讨厌“||而不是IF”多年。
我终于习惯了,现在我喜欢它。
我也喜欢以同样的方式使用&&。
我发现如果你自己采用简洁的做法,阅读别人简洁的代码就容易多了。
完全明白别人来自哪里。 在那里我自己。
此外,我想这会影响表演,因为
(typeof a != 'undefined') || (a = 0)
是由两个testing组成的(即使我们不关心第二个testing)。
而
if (typeof a == 'undefined') { a = 0; }
只包含一个testing