将数组与 JavaScript 中的 0 进行比较
Compare an array with 0 in JavaScript
我正在浏览我公司的代码库,发现了一个将数组与 0 进行比较的语句,如下所示:
数组 > 0;
如果我们让array = ["1"],它只有一个元素,上面的说法就成立;
但是如果 let array = ["1", "2"] or [],语句就会变成 false;
谁能解释这个语句的含义,为什么会产生这样的结果,以及它在任何情况下是否有用?
由于您将数组与数字进行比较,JavaScript 会将其转换为数字。您可以通过 Number(value)
手动执行此操作。从我的测试来看,它似乎只是试图将第一个值转换为一个数字。但是,如果有多个索引,则returnsNaN
。如果没有值,它 returns 0
.
据我所知,这个条件真的没有多大用处。在没有上下文的情况下很难确切地说出它的意思,但我的猜测是这是处理某些边缘情况的奇怪尝试。
当您使用 >
时,引擎将首先 convert both sides to a primitive,这将调用 valueOf
,并且,如果 return 不是原语,则toString
方法(如果存在)。对于数组,只有 toString
方法 return 是原语,所以这就是使用的方法 - 它所做的等同于做 .join(',')
.
console.log(['1', '2'].toString());
Looking at the spec again,在数组变成基本类型后,我们现在有一侧是字符串(来自数组),另一侧是数字。所以,两边都转换成数字:
d. Let nx be ? ToNumeric(px).
e. Let ny be ? ToNumeric(py).
然后比较数字。
在 ['1']
的情况下,你得到 1 > 0
,这是正确的。
在['1', '2']
的情况下,得到的字符串是'1,2'
,无法转换为数字,所以运行如下:
h. If nx or ny is NaN, return undefined.
并且当undefined
被这个算法return编辑时,整个>
评估to false
。
and if it would be useful in any situation?
对于干净、易于理解的代码,它通常不会。最好显式转换为比较首先具有直观意义的类型。
我正在浏览我公司的代码库,发现了一个将数组与 0 进行比较的语句,如下所示:
数组 > 0;
如果我们让array = ["1"],它只有一个元素,上面的说法就成立; 但是如果 let array = ["1", "2"] or [],语句就会变成 false;
谁能解释这个语句的含义,为什么会产生这样的结果,以及它在任何情况下是否有用?
由于您将数组与数字进行比较,JavaScript 会将其转换为数字。您可以通过 Number(value)
手动执行此操作。从我的测试来看,它似乎只是试图将第一个值转换为一个数字。但是,如果有多个索引,则returnsNaN
。如果没有值,它 returns 0
.
据我所知,这个条件真的没有多大用处。在没有上下文的情况下很难确切地说出它的意思,但我的猜测是这是处理某些边缘情况的奇怪尝试。
当您使用 >
时,引擎将首先 convert both sides to a primitive,这将调用 valueOf
,并且,如果 return 不是原语,则toString
方法(如果存在)。对于数组,只有 toString
方法 return 是原语,所以这就是使用的方法 - 它所做的等同于做 .join(',')
.
console.log(['1', '2'].toString());
Looking at the spec again,在数组变成基本类型后,我们现在有一侧是字符串(来自数组),另一侧是数字。所以,两边都转换成数字:
d. Let nx be ? ToNumeric(px).
e. Let ny be ? ToNumeric(py).
然后比较数字。
在 ['1']
的情况下,你得到 1 > 0
,这是正确的。
在['1', '2']
的情况下,得到的字符串是'1,2'
,无法转换为数字,所以运行如下:
h. If nx or ny is NaN, return undefined.
并且当undefined
被这个算法return编辑时,整个>
评估to false
。
and if it would be useful in any situation?
对于干净、易于理解的代码,它通常不会。最好显式转换为比较首先具有直观意义的类型。