奇怪的数组.长度替代语法
weird array.length alternative syntax
这让我感到惊讶:
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 === true
但NaN < 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
(,使用长度应该是完全安全的。
- 在ES6中将数组析构函数参数的语法
- 更改数组项的子元素(语法)
- 作为语法的控制器没有将新的obj传递给数组
- 分形数组语法
- JSON数组语法.花括号(对象语法)是严格必要的吗
- ES6 从数组解构为对象的语法
- Knockout.js 数组过滤器语法
- AngularJS控制器语法 - 数组和函数版本之间的差异
- JS语法错误 - 铬 - 数组解构
- JSON和Javascript数组之间的“交互”(和语法)
- 包含值和键的数组中的语法错误
- 数组中的 JavaScript 语法
- 找不到适用于 Highcharts 的 JSON 数组语法
- Javascript警报不起作用可能是由于数组语法
- 如何在对象内部获取数组,删除双引号并将其作为对象放入 JSON 语法中
- 对使用 for 循环添加到数组时的语法感到困惑
- 多维和关联数组正确语法
- 循环语法的2-D数组的困难时间
- 奇怪的数组.长度替代语法
- Javascript多维数组语法:我做错了什么