如何在循环中结合索引检查与双感叹号(!!)进行判断?
问题分析与解决方案
你的问题出在!!items[++i]的判断逻辑上:lodash的range(10)生成的是[0, 1, 2, ..., 9],其中第一个元素是0,而0在布尔判断里属于假值,!!0会返回false,导致循环刚进入就直接终止(看起来像是挂起,实际是根本没执行后续逻辑)。更关键的是,这种写法会把数组里所有假值(0、''、null、false等)都当成“终止信号”,不符合你想要遍历所有存在元素的需求。
下面是几种无需显式检查undefined的简写布尔判断方式,既能正确遍历所有元素,又不会提前终止:
1. 使用严格不等于判断(最接近原逻辑)
let i = -1; while (items[++i] !== undefined) { console.log(items[i]); }
和你原来的!= undefined逻辑一致,只是用了严格不等!==,更符合JS的最佳实践,写法也足够简洁。
2. 使用in操作符检查索引存在性
let i = -1; while (++i in items) { console.log(items[i]); }
in操作符会检查指定索引是否属于数组(包括显式设置的undefined元素),只要索引存在,不管元素是什么值,都会进入循环。
3. 使用hasOwnProperty检查自身索引
let i = -1; while (items.hasOwnProperty(++i)) { console.log(items[i]); }
和in类似,但只会检查数组自身的索引属性,不会考虑原型链上的属性,安全性更高,适合严格场景。
注意:如果你的数组里存在显式设置的undefined元素(比如items[3] = undefined),第一种方式会跳过该元素,而后面两种方式会正常遍历它,根据你的实际需求选择即可。
内容的提问来源于stack exchange,提问作者kdd
相关产品推荐
相关产品推荐

