Javascript 奇怪的array.length替代语法
这让我感到惊讶:Javascript 奇怪的array.length替代语法,javascript,Javascript,这让我感到惊讶: var parts = email.split('@'); if (parts < 2) { var parts=email.split('@'); 如果(部件
var parts = email.split('@');
if (parts < 2) {
var parts=email.split('@');
如果(部件<2){
参考:
本质上,它看起来像:
var a = [null, null, null]
a < 2 // false
var b = [null]
b < 2 // true
var a=[null,null,null]
a<2//错误
var b=[null]
b<2//正确
因此,它似乎是有效的,但我想知道为什么,它要这样做实际上会发生什么强制?因为这里的意图是,如果电子邮件字符串中只有不到2个部分,我希望它总是通过,因为定义的数组是真实的-它应该创建一个至少有1个成员的数组,即使在空字符串上也是如此
我总是喜欢使用数组。长度。上面的值安全吗?使用
运算符将数组与数字进行比较是不安全、不可靠或不正确的。您不应该这样做
以下是转换规则取自:
这些比较运算符的操作数可以是任何类型。
但是,只能对数字和字符串执行比较,因此
转换非数字或字符串的操作数。比较和
转换过程如下所示:
如果两个操作数都是数字,或者都转换为数字,则它们都是数字
数字比较
如果两个操作数都是字符串或转换为字符串,则比较它们
作为字符串
如果一个操作数为或转换为字符串,而另一个操作数为或转换为
数字,运算符尝试将字符串转换为数字,然后
执行数字比较。如果字符串不代表
数字,它将转换为NaN,并且比较为false。(在
JavaScript 1.1中,字符串到数字的转换会导致错误
而不是屈服。)
如果对象可以转换为数字或字符串,
JavaScript执行数字转换。这意味着,例如,
对日期对象进行数字比较,这对
比较两个日期,看一个是否早于另一个
如果比较运算符的操作数不能同时为
成功地将这些运算符转换为数字或字符串
总是返回false
如果操作数为或转换为NaN,则比较运算符
总是会产生错误
在这种特殊情况下,由于没有将数组转换为数字,它最终会比较两个字符串,这是完全不可靠的
这也是为什么您应该只比较两个相同类型的项目的另一个原因。在这种情况下,直接使用.length
属性并使用:
a.length > 2
我觉得这不安全,因为:
[0, 0] > 1 // false
及
但是
[null,null,null]<2->,,”<2->NaN<2->false
这是一个字符串,然后是数字转换,因为数组不能直接与相比,数组不能转换为数字。这里发生的是数组正在转换为字符串
当数组转换为字符串时,JavaScript在内部执行array.join(',')
所以,['a','b']
变成了“a,b”
[null]
是,[null,null]
是,“
。这是因为null
被转换为空字符串
所以,[null,null]<2
是,“<2
是false
要获得数组的长度,请使用.length
哦,这很安全,它只是不比较您认为它比较的内容
表达式parts<2
正在将数组与数字进行比较。要完成此比较,JavaScript必须将这两个值转换为通用类型,唯一可用的是字符串。toString()数组对象的方法使用逗号连接数组元素的每个字符串值,null的字符串值是空字符串。因此,您的测试表达式正在执行“,”<“2”
和”<“2”
,我确信这不是预期的结果
只要不在数组上使用delete
(而是使用slice
),使用长度应该是完全安全的。好吧,数组。考虑到删除元素时长度并不总是重新调整,因此长度也不总是安全的;)@JeffreySweeney-。长度始终表示数组的实际长度。如果使用类似.splice()
或.pop()的内容删除元素
,则.length
将立即可靠地返回新的长度。如果仅将数组元素设置为“未定义”,则该数组元素仍然存在,并且所有其他数组元素保持在相同的位置,因此.length
值不会正确更改。您能描述一下.length
是什么时候更改的吗不准确。感谢您的回复,完成了健全性检查,提交了问题,我没有发疯…@jfriend00删除数组末尾的元素不会调整长度属性(可能是有意的),而且过去也存在浏览器差异()。此外,更改属性本身太容易了,一个错误的框架或懒惰的程序员可能会造成很多混乱。@JeffreySweeney-你没有任何意义。那么,如果你不使用.length
属性,你甚至建议如何使用数组?还有,你建议OP做什么来解决他们的问题。数组
没有一个toNumber
,当转换成一个数字时,一个数组就是NaN
。是的,在我的端口中,我就是这么做的,length。我已经为此提交了一张罚单,有人试图说服我它实际上是正确的,所以我认为我错过了某种强制。谢谢!谢谢,这正是我所希望的。我使用了空值例如,但字符串拆分的结果始终包含字符串。@Dimitar Christoff:True;唯一能在数组->字符串->数字转换后存活的数组
[0, 0] < Infinity // false
[null] < 2 -> null < 2 -> 0 < 2 -> true
[null, null, null] < 2 -> ',,' < 2 -> NaN < 2 -> false