33

看起来:

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

(typeof a != 'undefined') || (a = 0)

在 Javascript 中具有相同的效果。

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

4

10 回答 10

76

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

这实际上就是JSLint想要表达的意思:

需要一个条件表达式,而是看到一个赋值。

我避免使用令人困惑的结构,因为它们会损害可读性。a = a || 0;是更容易识别和含义相似的方式。

于 2012-09-28T07:23:05.560 回答
31

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

a = a || 0;

或者

a = a ? a : 0;

在这两种情况下,您还可以清楚地看到某些内容被分配给a,就在行的开头,而无需阅读整个内容,并确定其中是否发生了任何改变游戏规则的函数调用左侧或右侧......或弄清楚双方通常会做什么,以决定可能有多少潜在的程序范围内的变化。

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

a = (typeof a !== "undefined") ? a : 0;  // [parentheses are there for clarity]
于 2012-09-28T07:29:02.237 回答
9

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

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

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

不,JsLint 是对的。这是不寻常且令人困惑的,至少对其他开发人员而言。它看起来太像 OR 条件了——但它没有“主体”。如果你做赋值,变量应该在语句的开头,而不是在某个表达式中。

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

然后使用

if (typeof a == 'undefined') a = 0;
于 2012-09-28T12:19:12.423 回答
2

您可以使用:

a = typeof(a) !== "undefined" ? a : 0; 
于 2012-09-28T09:25:12.057 回答
1

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

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

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

于 2012-09-28T09:59:16.693 回答
1

请问你为什么更喜欢一行代码?

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

今天像 UglifyJS 这样的缩小器知道如何缩短代码,所以你可以两者兼得,而且你不需要担心这个级别的细节。我将您的代码提供给 UglifyJS,这是输出:

typeof a=="undefined"&&(a=0)

你可以在这里试试:

http://marijnhaverbeke.nl/uglifyjs

[更新] 我个人的偏好(再次考虑到可读性)是在有选择时使用,并且 || 对于后备。您的具体示例似乎是一个后备(如果 a 不存在或未定义,则分配给 a 值 0),所以我会使用 ||。正如我在评论中所说, (var a=0) 在尚未声明变量 a 的情况下(我不知道您的上下文)对我来说更有意义。

于 2012-10-05T16:06:23.807 回答
1

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

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

在您的情况下,当您在条件和赋值中有一个变量时,请使用单行 javascript 三元运算符:

a = (typeof a == 'undefined') ? 0 : a;
于 2012-10-08T13:34:28.087 回答
1
(typeof a != 'undefined') || (a = 0)

是一个表达式。但它的子表达式之一

(a = 0)

是一个任务。所以本质上,这是一个有副作用的表达式。具有副作用的语句(尤其是那些是表达式的语句)通常是您在介绍性编码课程中首先学会不做的事情之一。那么为什么仅仅因为它只需要一条线就这样做呢?

于 2012-10-11T22:08:49.123 回答
0

多年来,我讨厌“|| 而不是 IF”。

我终于习惯了,现在我喜欢它。

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

我发现如果你自己采用简洁的做法,阅读其他简洁的代码会容易得多。

完全了解其他人的来源。我自己去过那里。

于 2012-10-05T14:26:27.927 回答
0

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

(typeof a != 'undefined') || (a = 0)

由两个测试组成(即使我们不关心第二个)。

然而

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

仅包含一项测试

于 2012-10-05T17:40:30.933 回答