为啥我们不应该在 javascript 中使用 ++? [复制]

Posted

技术标签:

【中文标题】为啥我们不应该在 javascript 中使用 ++? [复制]【英文标题】:why shouldn't we use ++ in javascript? [duplicate]为什么我们不应该在 javascript 中使用 ++? [复制] 【发布时间】:2011-03-15 09:25:40 【问题描述】:

可能重复:Why avoid increment (“++”) and decrement (“--”) operators in javascript?

我在一些地方听说不建议在 javascript 中使用 ++ & -- ,我们应该使用 += 1 或 -= 1 来代替。谁能帮我解释一下为什么?

【问题讨论】:

它们被解释为同一个东西。你从哪里听到这个? 罪魁祸首确实是 Crockford :) ++ 和 -- 被包含在 JS 中是有原因的,我说,让我们使用它.... @The Elite with 包含在 JS 中也是有原因的。做出糟糕的语言决定的人不是依赖它的理由。 with 并不完全糟糕。除非您知道自己在做什么,否则它很少有用并且最好避免使用,但卑鄙可能会稍微推动它。 【参考方案1】:

因为道格拉斯·克罗克福德 (Douglas Crockford) 对某些事情可能会或可能不会令人困惑有自己的看法。它们很好用,JSLint 只是在表达他的意见。

【讨论】:

好的,有道理,而且这里似乎也是共识,所以我会继续使用++。 Javascript 确实时不时地有一些奇怪的做事方式,很难判断推荐是个人的事情还是基于性能的事情。 我非常喜欢 The Good Parts,但我对他宣布一元递增和递减为坏部分的理由感到非常失望。当然,它们可以以多种方式使用——比如虐待狂/受虐狂 for 循环的一部分——但这适用于许多语言特性。如果你花足够的时间创建疯狂的例子,它可能适用于所有这些。 叹息。克罗克福德有很多要回答,我希望人们不要把他的意见当成福音…… 虽然我不同意 Crockford 的一些建议(这和他对new 的拒绝让我想起了),但正如知名 JavaScripters 的意见所言,我认为他的建议很漂亮好的。他为普及一些强大的技术做了很多工作。五年前,他的想法领先于我遇到的几乎所有人。【参考方案2】:

有人介意我提出相反的建议吗...?

请尽可能使用递增 (++) 和递减 (--) 运算符。更直接。 (这就是他们的目的。)

【讨论】:

同意。为什么不应该我们首先使用一些更方便的语言元素,让 C 语法如此酷炫? 我不介意++/--,我一直在使用它们。然而。我不确定我是否可以真的更直接地称呼它们。考虑var c = a++ + bvar c = a + ++b所有三个变量将具有不同的值,具体取决于您在此处放置空格的位置,这可能会导致误解var c = a+++b @David Hedlund - 是的。有潜在的混乱。但是,自增运算符意味着要自增。它的目的很简单。使用+= 1= var + 1 在我看来,当您想将某物加倍而不是x * 2 时,您喜欢使用x + x。按您的意思编码。 x++/++xx += 1 更直接。后者在我看来和前者一样简单。如果我们已经有了可读且更灵活的语法来增加任何值,为什么还要添加仅增加(和减少)1 的特殊语法?【参考方案3】:

Crockford 等人的原因。不鼓励使用 ++/-- 是因为它们会引入副作用。几乎没有理由使用i+=1; 代替i++;,因为两者都是单个语句,但是有很多理由让一个语句只做一件事,而++ 很容易违反该规则。

不鼓励使用++ 意味着我们不必在脑海中记住i++++i 之间的区别。这意味着我们不太可能尝试以聪明但令人困惑的方式使用它们。出于这些原因,最好不要使用它们。

【讨论】:

我完全同意。另外,我认为我们应该尽可能简单,包括语言语法。如果我们已经有了将变量递增任何值的语法,为什么还要添加特殊语法以仅将变量递增 1 (x++/++x)?对我来说这没有任何意义。【参考方案4】:

我唯一一次在Douglas Crockford'sJavaScript: The Good Parts 书中看到这些运营商不受欢迎。

引用“坏部分”附录:

递增和递减运算符使编写极其简洁的风格成为可能。在诸如 C 之类的语言中,它们使得编写可以进行字符串复制的单行代码成为可能:

for (p = src, q = dest; !*p; p++, q++) *q = *p;

他们还鼓励一种编程风格,事实证明,这种风格是鲁莽的。大多数造成严重安全漏洞的缓冲区溢出错误都是由这样的代码引起的。

在我自己的实践中,我观察到当我使用++--, 时,我的代码往往过于紧凑、过于神秘。所以,作为纪律问题,我不再使用它们了。我认为因此,我的编码风格变得更加清晰。

另外引用JSLint documentation(他写的代码质量工具):

众所周知,++(递增)和--(递减)运算符会通过鼓励过度的技巧来导致糟糕的代码。它们在启用病毒和其他安全威胁方面仅次于错误的架构。有一个 plusplus 选项禁止使用这些运算符。

他真的不喜欢这些操作员……但是来吧!我认为我们仍然可以使用++-- 运算符而无需编写神秘代码。我使用它们,我喜欢它们。每个人都使用它们。

请注意,虽然JSLint 有禁止这些运算符的选项,但默认情况下不启用此选项。

【讨论】:

说得好。在我看来,克罗克福德似乎将他脚上的洞归咎于枪。又或许是那个稻草人干的…… 造成严重安全漏洞的大多数缓冲区溢出错误是由于 C 字符串以空值结尾的事实。 您说“我们仍然可以使用 ++ 和 -- 运算符而无需编写神秘代码”。真的。但是,如果我们能够坚持使用从未有这些危险并且与​​以前的工具一样富有表现力的工具,为什么还要继续使用可能被其他人过度使用的工具(如果我们没有足够的自律的话,我们也会过度使用)?我们可以将变量增加+= 1,而不会遇到容易遗漏错误或混淆代码的危险,就像我们使用++时一样。【参考方案5】:

我能想到的唯一原因是,与您编写的任何其他代码(html??)相比,您的 Javascript 更有可能被白痴编辑。

对于菜鸟来说,

x=x+1 ;

更具可读性
x++;

在与有经验的程序员打交道时,这真的没关系。

【讨论】:

【参考方案6】:

使用++/--可以限制js缩小选项,因为它们的含义对空格非常敏感。根据 minifier 的不同,它甚至可能会在工作代码中引入错误。 Crockford 解释(在警告部分)here。

【讨论】:

不要使用不理解它所压缩的代码的压缩器。【参考方案7】:

我能想到的唯一好理由是清晰。您不必担心以下情况:

var result = ++i;

或者:

var result = i++;

【讨论】:

永远不要使用你不懂的东西。请使用你确实理解的东西! (同样的事情也适用于breakcontinue、Delphi 的with 以及过去几周我们在 SO 上争论的所有其他事情。) @Andreas,类似的事情听起来不错,但实际上,有多少专业人士能够负担得起学习看穿每个抽象层并理解从量子物理学到 GUI 的系统?我确实相信每个人都应该努力学习他们工作的抽象层的操作模型的细节。我说“努力”是因为通常无法知道您何时真正了解抽象层操作模型的每个细节。 @Andreas 有一个更强有力的原则——永远不要使用容易被自己或他人误解的东西。 ++ii++ 之间的区别就是一个很好的例子。【参考方案8】:

使用++,是标准的并且有一个很好的情况。

【讨论】:

以上是关于为啥我们不应该在 javascript 中使用 ++? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不应该在 py 脚本中使用 sys.setdefaultencoding("utf-8") ?

为啥我们不应该在 py 脚本中使用 sys.setdefaultencoding("utf-8") ?

为啥使用命名函数表达式?

当运算符优先级说不应该时,为啥短路评估会起作用?

在 GWT 中,为啥方法不应该返回接口?

为啥我应该在javascript中的每个函数后使用分号?