`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 【问题描述】:

假设数组中的所有元素的值都不同于undefinednull0,则

if (idx &lt; 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])`?的主要内容,如果未能解决你的问题,请参考以下文章

js 随机数

js 排序 冒泡 选择 快排

选择排序

js---快速排序

JS排序算法冒泡排序

js bubbleSort