`if (idx < arr.length)` 是不是等同于 `if (arr[idx])`?
Posted
技术标签:
【中文标题】`if (idx < arr.length)` 是不是等同于 `if (arr[idx])`?【英文标题】:Is `if (idx < arr.length)` equivalent to `if (arr[idx])`?`if (idx < arr.length)` 是否等同于 `if (arr[idx])`? 【发布时间】:2022-01-23 03:50:21 【问题描述】:假设数组中的所有元素的值都不同于undefined
、null
或0
,则
if (idx < arr.length)
等同于if (arr[idx])
?
【问题讨论】:
只要没有错误值,它就可以工作。 数组中的所有元素都不是布尔值 === false ? 不一样:如果idx
是负数怎么办? ;)
【参考方案1】:
没有。
在if
语句中还有其他falsy 值将评估为false
,例如空字符串(''
):
const arrWithEmptyString = ['', '', ''];
const idx = 2;
console.log(!!(idx < arrWithEmptyString.length));
console.log(!!arrWithEmptyString[idx]);
或者,如果数组包含布尔值false
,该怎么办?
const boolArray = [true, false, true, false]
const idx = 3;
console.log(!!(idx < boolArray.length));
console.log(!!boolArray[idx]);
Type coercion/type conversion 在 JS 中可能会令人困惑和不可预测——在我看来,通常最好是明确地测试你想要测试的东西,而不是依靠弱类型比较来保存几个字符。
【讨论】:
我明白了,还有更多我没有想到的值为 false 的值。但是如果数组中的值不计算为假怎么办?在这种情况下,是否可以使用if (arr[idx])
检查idx
处的元素是否在数组内?是难读还是风格不好?
你可以看到我的更新——在一些地方你可以依靠自动类型转换/强制来变得聪明,但通常我建议你明确并且准确测试您要评估的内容,以获得更好的可读性和更低的意外/错误行为的可能性。如果您只是想知道索引处的值是否是假的,那么一定要使用array[idx]
-- 但是如果您想知道它是否是数组中的入站,使用.length
检查在语义上更准确,并且与您实际尝试评估的内容一致。
我想检查array[idx]
的元素是否存在。通常我通过写if (something)
来检查something
是否存在。但我也知道,如果索引在数组的长度范围内,则元素确实存在。所以很难说什么在语义上更准确。
是的,听起来您手头的情况有些模棱两可。我想如果你只是检查存在,并且你确信你不会有错误的值,那么存在检查是正确的方法。你总是可以让它更具体,并包括防止虚假的护栏。祝你好运,编码愉快!【参考方案2】:
Alexander Nied 给出了很好的答案,NaN 的计算结果也为假
const boolArray = [NaN, NaN, NaN, NaN]
const idx = 3;
console.log(!!(idx < boolArray.length));
console.log(!!boolArray[idx]);
【讨论】:
以上是关于`if (idx < arr.length)` 是不是等同于 `if (arr[idx])`?的主要内容,如果未能解决你的问题,请参考以下文章