数组长度与数组长度大于0的比较

25

检查数组长度作为真值和检查其是否大于0之间有区别吗?换句话说,使用以下哪种语句之一有任何理由:

var arr = [1,2,3];
if (arr.length) {
}

if (arr.length > 0) {
}

如果你知道它是一个对象数组(比如DOM查询结果库调用),那么if(arr[0])也可以正常工作。 - dandavis
1
热烈欢迎参与代码审查并进行争论的各位。 - user10706046
3个回答

23

检查数组的长度作为真值与检查其是否> 0之间是否有区别?

由于arr.length的值只能是0或更大,而且0是唯一计算为false的数字,所以没有区别。

总的来说,对于n < 0Boolean(n)Boolean(n > 0)产生不同的结果。

换句话说,有没有理由使用其中一个语句而不是另一个语句?

只有与代码可读性和理解相关的原因,而不涉及行为方面。


2
你可以用JavaScript做任何事情,即使它很愚蠢或难以阅读。编写易读代码需要优秀的开发人员。 - LoremIpsum
2
这也是可以争论的,哪种写法更易读。在我看来,是 if (array.length),但我知道其他人更喜欢 if (array.length > 0) - rooby

15

有趣的是,在Chrome 59中,array.lengtharray.length > 0运行得更慢。不确定为什么会这样,因为直觉上似乎它应该做得更少。 - Hanna
1
Chrome VM 会针对每个新版本进行不同的优化。如果你需要思考编译器背后正在做什么,那么了解 V8 是用 C++ 编写的,而 C++ 是有类型的,数组长度是一个数字,被视为布尔表达式,所以我会说在某些情况下它执行等效于 Boolean(array.length) 的操作,当 > 0 不出现时。在 JavaScript 中有很多不同的值可以是 true 或 false,并且它们都需要检查(null、false、undefined、0、'' 等)。 - zeachco

11
在JavaScript中,它们没有区别。
最终,在if圆括号之间的任何内容都将评估为truthyfalsey值。
有关所有可能的falsey值,请参见JavaScript中的所有falsey值
如果您希望更清晰明确,请使用。
if (arr.length > 0) {
}

如果您希望更简洁,请使用。
if (arr.length) {
}

5
为了强调这个答案,许多开发人员选择明确而不是简洁。这有助于在扫描代码时提高可读性。否则,没有区别。 - Mwr247
1
更明确的是肯定的。但更清晰则有争议。在某些情况下,比如这个例子,我认为两种选项的清晰度相对相等。通常我会选择更冗长的选项,但在这种情况下,我认为它并没有增加任何价值。我把它理解为“如果数组的长度”,在我看来这是完全可以理解的,所以我认为>0并没有增加价值。我认为它实际上只是增加了不必要的噪音,尽管可能是因为多年来我已经适应了没有>0的阅读方式,所以我能理解对于不习惯这种写法的人来说,这样做可能更容易。(看,我通常是支持冗长的:D) - rooby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接