Javascript:| |而不是IF语句-此语句合法且跨浏览器有效吗?

Javascript:| |而不是IF语句-此语句合法且跨浏览器有效吗?,javascript,Javascript,似乎: if (typeof a == 'undefined') { a = 0; } 及 在Javascript中具有相同的效果 我真的很喜欢第二个,因为它很短,一行代码,但这是合法的,跨浏览器有效吗? 我是说,jslint说它有错误。我应该毫无顾虑地使用它吗 IMHO| | |(a=0)与| |(a==0)过于相似,因此容易混淆。总有一天,狂热的开发人员会“修复它”,改变代码的含义。所有其他开发人员都必须坐一会儿,才能弄清楚这是您的意图还是一个简单的bug 事实上,这就是我们想要说

似乎:

if (typeof a == 'undefined') {
    a = 0;
}

在Javascript中具有相同的效果

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

IMHO
| | |(a=0)
| |(a==0)
过于相似,因此容易混淆。总有一天,狂热的开发人员会“修复它”,改变代码的含义。所有其他开发人员都必须坐一会儿,才能弄清楚这是您的意图还是一个简单的bug

事实上,这就是我们想要说的:

应为条件表达式,而应为赋值


我避免使用混乱的结构,因为它们会损害可读性<代码>a=a | | 0在意义上更容易识别和相似。

为什么不做一些更简单的事情,比如:

a = a || 0;

在这两种情况下,您还可以清楚地看到某个东西被分配给了
a
,就在该行的开头,而不必阅读整个内容,也不必弄清楚在左侧或右侧是否有任何改变游戏规则的函数调用。。。或者弄清楚双方通常都做些什么来决定可能会有多少潜在的项目范围的变化

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

a = (typeof a !== "undefined") ? a : 0;  // [parentheses are there for clarity]
您可以使用:

a = typeof(a) !== "undefined" ? a : 0; 

在风格上,设置默认值,如
a | | a=default
,是进入函数时常用的习惯用法,因为javascript不强制参数的数量

如果在其他情况下使用此结构,可读性将受到影响,您真正的意思是if/else

在不同的风格之间,性能过去会有所不同,但在今天的快速测试中,if/else和逻辑运算符的速度相同,但三元运算速度较慢

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

是的,它将在所有EcmaScript引擎中工作。然而,(ab)使用短路评估作为if语句是非常少见的

我是说,jslint说它有错误。我应该毫无顾虑地使用它吗

不,JsLint是对的。至少对其他开发人员来说,这是不寻常和令人困惑的。它看起来太像一种疾病,但它没有“身体”。如果执行赋值,则变量应该位于语句的开头,而不是某个表达式的内部

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

然后使用

if (typeof a == 'undefined') a = 0;
多年来,我讨厌“而不是如果”

我终于习惯了,现在我喜欢上了

我也喜欢以同样的方式使用&&

我发现,如果您自己采用简洁的实践,阅读其他简洁的代码会容易得多


但要完全理解其他人是从哪里来的。我自己也去过。

请问您为什么喜欢一行代码

作为一个人,我更喜欢可读的代码。我的机器喜欢短而快的代码(易于加载和执行)

如今,像UglifyJS这样的迷你们知道如何缩短代码,所以您可以同时拥有这两种代码,而无需担心这一级别的细节。我将您的代码提供给了UglifyJS,以下是输出:

typeof a=="undefined"&&(a=0)
您可以在这里尝试:


[更新]我个人的偏好(同样考虑到可读性)是在有选择时使用if,而| |用于回退。您的特定示例似乎是一个回退(如果a不存在或未定义,则将值0赋给a),因此我将使用| |。正如我在评论中所说,如果变量a尚未声明(我不知道您的上下文),那么(var a=0)对我来说更有意义。

此外,我认为它会影响性能,因为

(typeof a != 'undefined') || (a = 0)
由两个测试组成(即使我们不关心第二个测试)

鉴于

if (typeof a == 'undefined') {
    a = 0;
}

只包含一个测试

我认为使用这样的结构很糟糕。它可以工作,但代码不可读。如果要编写单行条件,可以开始使用CoffeeScript并编写:

a = 0 if (typeof a == 'undefined');
在您的情况下,当条件和赋值中有一个变量时,请使用一行javascript运算符:

a = (typeof a == 'undefined') ? 0 : a;
这是一个表达。但是它的一个子表达式

(a = 0)

这是一项任务。所以本质上,这是一个有副作用的表达式。有副作用的陈述(尤其是那些经验),通常是你在介绍性编码课程中首先学会的而不是要做的事情之一。那么,为什么仅仅因为它只需要一行就这么做呢?

这只是一个问题。复杂代码的用途是什么?稍微好一点的版本应该是
a=(typeof a!=='undefined')?a:0(typeof a!=“undefined”)| |(a=0)非常适合js“加密”。人生忠告,不要只为自己编码。如果你只想要一行代码,为什么不在(typeof a=='undefined)a=0时做
一行?喜欢过于“聪明”的代码只是一个阶段,经验可以治愈它。:)甚至我认为开发人员可能会将其误认为是打字错误。顺便说一句,当a开始时是0,a=a | | 0将有点毫无意义,因为0是错误的,因此a将被重新设置为零。快速jsperf显示(typeof a=='undefined')与(!a)一样快,因此,为了避免明显的字符串比较,甚至没有任何速度改进。
a=a | | 0
是不同的。您正在做的是为
false
null
获取0,这可能不是OP想要的。我可能错了,但我的假设是OP真正想要的是var a=0,而不是a=0。如果是这样,(var a=0)显然是一个变量赋值,不能与(a==0)混淆。三元赋值(a=cond?a:默认值)在a通过测试时浪费赋值。写入cond | |(a=默认值)仅在a未通过测试时执行赋值。这对ES5(Javascript的新版本)和属性的到来更为重要,属性可以有赋值样式设置器。@PhilH您在各种通信中一直这么说
a = (typeof a == 'undefined') ? 0 : a;
(typeof a != 'undefined') || (a = 0)
(a = 0)