Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 奇怪的array.length替代语法_Javascript - Fatal编程技术网

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