ES6中find()方法与0比较时始终返回true的问题求助
解惑:ES6 find()与0比较时的“奇怪”行为
哈哈,这个坑我之前也踩过!问题出在你对find()方法的返回值和逻辑非!的结合理解上,咱们一步步拆解清楚:
核心问题:find()的返回值不是布尔值
很多人会误以为find()返回true/false,但实际上它的规则是:
- 当找到匹配元素时,返回该元素本身,而非布尔值
- 当找不到匹配元素时,返回
undefined
再看你的测试代码:
- 第一个场景:
test.find(...)匹配到了数组里的0,所以返回值是0。而!0的结果是true(因为0是JavaScript中的假值,逻辑非取反后变成真) - 第二个场景:
test.find(...)找不到匹配的5,返回undefined。!undefined的结果同样是true(undefined也是假值,取反后为真)
这就是为什么两个表达式的最终结果都是true——不是find()的判断逻辑错了,是你后续的!对不同假值的取反导致了相同结果。
正确的判断方式
如果你想判断数组中是否存在匹配的元素,推荐用专门返回布尔值的some()方法:
// 匹配到0,some()返回true,!取反后为false !test.some((id) => { var comparison = 0; console.log(comparison === id); return comparison === id }); // 没匹配到5,some()返回false,!取反后为true !test.some((id) => { var comparison = 5; console.log(comparison === id); return comparison === id });
如果非要用find(),可以显式判断返回值是否为undefined:
!(test.find(elem => elem === 0) !== undefined) // 结果为false !(test.find(elem => elem === 5) !== undefined) // 结果为true
为什么其他数值没问题?
比如数组里是[1],当匹配成功时find()返回1(真值),!1的结果是false,这时候你就能看到符合预期的取反结果。只有当匹配到的元素是假值(0、''、null、undefined等)时,!的取反才会让你产生“find()返回true”的错觉。
内容的提问来源于stack exchange,提问作者SrAxi
相关产品推荐
相关产品推荐

