奇怪的数组.长度替代语法

weird array.length alternative syntax

本文关键字:语法 数组      更新时间:2023-09-26

这让我感到惊讶:

var parts = email.split('@');
if (parts < 2) {

参考: https://github.com/Kicksend/mailcheck/blob/master/src/jquery.mailcheck.js#L21-22

本质上,它看起来像:

var a = [null, null, null]
a < 2 // false
var b = [null]
b < 2 // true

所以它看起来有效,但我想知道为什么,它这样做实际上发生了什么胁迫? 由于这里的意图是在电子邮件字符串中少于 2 个部分时保释,我本来希望它总是通过,因为定义的数组是真实的 - 它应该创建一个至少具有 1 个成员的数组,即使在空字符串上也是如此。

我总是更喜欢使用array.length。 以上安全吗?

这是一个字符串,然后是数字转换,因为数组不能与<运算符相比是直接的。首先,它将进行字符串比较,但与数字进行比较,然后进行数字比较。

请注意:

  • [null, null, null] == ",,"
  • [null] == ""

和:

  • +",," NaN
  • +"" === 0

现在这是有道理的,因为0 < 2 === trueNaN < 2 === false.

因此,这确实不是一个有意义的表达。 [null, null] < 3之所以false,是因为"," < 3本质上是在做NaN < 3

我感觉它不安全,因为:

[0, 0] > 1 // false

[0, 0] < Infinity // false

好吧,它根本不是比较元素的数量。它比较数组的字符串表示形式,因此NaN < Infinity给出false .所以答案是否定的,这根本不是一个安全的选择,因为他们不会远程做同样的事情。它只适合您,因为:

[null] < 2 -> null < 2 -> 0 < 2 -> true

[null, null, null] < 2 -> ',,' < 2 -> NaN < 2 -> false

使用 <> 运算符将数组与数字进行比较是不安全、可靠或正确的。 你不应该这样做。

以下是O'Reilly这本书中的转换规则:

这些比较运算符的操作数可以是任何类型的。 但是,只能对数字和字符串进行比较,因此,因此 将转换不是数字或字符串的操作数。比较和 转换发生如下:

如果两个操作

数都是数字,或者如果两个操作数都转换为数字,则它们是 在数字上进行比较。

如果两个操作数都是字符串或转换为字符串,则比较它们 作为字符串。

如果一个操作数是或转换为

字符串,而另一个操作数是或转换为 数字,运算符尝试将字符串转换为数字和 执行数值比较。如果字符串不表示 数字,它转换为 NaN,并且比较是错误的。(在 JavaScript 1.1,字符串到数字的转换导致错误 而不是产生 NaN。

如果对象可以转换为数字或字符串, JavaScript 执行数值转换。这意味着,例如, 日期对象以数字方式进行比较,并且有意义的是 比较两个日期以查看一个日期是否早于另一个日期。

如果比较运算符的操作数不能同时为 成功转换为数字或字符串,这些运算符 始终返回假。

如果任一操作数为 或转换为 NaN,则比较运算符 总是产生错误。

在这种特殊情况下,由于没有将数组转换为数字,因此最终会比较两个完全不可靠的字符串。

这是您应该只比较相同类型的两个项目的另一个原因。 在这种特殊情况下,直接使用 .length 属性并使用以下代码也是更具可读性的:

a.length > 2

数组不能转换为数字。 这里发生的事情是数组正在转换为字符串。

当数组转换为字符串时,JavaScript 内部会array.join(',')

所以,['a','b']变得"a,b".

[null]""[null,null]",".这是因为null被转换为空白字符串。

所以,[null,null] < 2 "," < 2这是错误的。

要获取数组的长度,请使用 .length

,它很安全,它只是没有比较你认为的比较。

表达式parts < 2将数组与数字进行比较。要完成此比较,JavaScript 必须将这两个值转换为通用类型,并且唯一可用的值是字符串。数组对象的 toString(( 方法连接带逗号的数组元素的每个字符串值,null 的字符串值为空字符串。所以你的测试表达式正在执行",," < "2""" < "2",我确信这不是想要的。

只要你不在数组上使用delete(改用slice(,使用长度应该是完全安全的。