用了这么多年数组的 every 方法,才发现我的理解一直是错的!

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心

背景

今天在开发项目的时候,我的组员造成了一个BUG,原因是用了一个挺常用的数组方法:ervey ,相信大家都见过,或者都用过,它经常跟 some 成双出现,我们理解这两个方法是:

  • every: 判断数组每一项是否符合条件
  • some: 判断数组是否至少有一个符合条件

可以通过一个小例子来认识,我准备了一个用户数组,我分别想做两件事:

  • 1、判断是否所有人都成年了
  • 2、判断是否有人大于20岁

有坑?

再来项目中搞的代码吧,逻辑也跟上述例子差不多,就是通过请求获取一组用户,并判断这组用户是否全都已成年

但是这个代码却出现了BUG,什么呢?就是当 users 是空数组的时候,every 会返回 true!!!不信我们可以看看

我当时看到了,也感觉挺不解的,按理说,every: 判断数组每一项是否符合条件,那如果数组为空的话,那就是没有一个符合条件的,不应是返回 false 吗,不过先不管,先改BUG 先,后面再去想了,加个长度判断,先解决BUG先

空数组,every 返回 true?

我们先来看一下ECMA-262定义的Array.prototype.every

可以看到,every 是判断每一次执行循环函数是否有 false 返回,有的话直接返回 false,如果一个 false 都没有,那就返回 true

关于空数组调用 every() 返回 true 的原因,MDN 网页 提供了答案:

every 的作用就像数学中的"for all"量词。特别是,对于空数组,它返回 true。(地球人都知道,空集的所有元素都满足任何给定的条件。)

空真(Vacuous truth) 是一个数学概念,它意味着若给定条件(称为前提)不能满足(比如给定条件不为真),则某事为真。用 JS 的术语来说,every() 返回 true,是因为它无法调用回调。回调表示要测试的条件,如果因为数组中没有值而无法执行,那么 every() 必须返回 true。

全称量词 是数学中一个更大主题的一部分,它允许您对数据集进行推理。考虑到 JS 数组对于执行数学计算的重要性,尤其是类型化数组,为此类操作提供内置支持是有意义的。every() 不是孤例。

改变思维

以前我人为的:every 判断数组每一项是否符合条件

但是我觉得我不应该那么理解,我应该理解为:every 判断数组是否至少有一个不符合条件,这么去理解的话,自然就能知道为什么空数组是返回 true了,因为就没有不符合条件的,当然就是返回 true 啦~

结语 & 加学习群 & 摸鱼群

我是林三心

  • 一个待过小型toG型外包公司、大型外包公司、小公司、潜力型创业公司、大公司的作死型前端选手;
  • 一个偏前端的全干工程师;
  • 一个不正经的掘金作者;
  • 一个逗比的B站up主;
  • 一个不帅的小红书博主;
  • 一个喜欢打铁的篮球菜鸟;
  • 一个喜欢历史的乏味少年;
  • 一个喜欢rap的五音不全弱鸡

如果你想一起学习前端,一起摸鱼,一起研究简历优化,一起研究面试进步,一起交流历史音乐篮球rap,可以来俺的摸鱼学习群哈哈,点这个,有7000多名前端小伙伴在等着一起学习哦 --> 摸鱼沸点

相关推荐
正小安1 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
_.Switch3 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光3 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   3 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   3 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web3 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
安冬的码畜日常3 小时前
【CSS in Depth 2 精译_044】第七章 响应式设计概述
前端·css·css3·html5·响应式设计·响应式
莹雨潇潇4 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr4 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
Tiffany_Ho5 小时前
【TypeScript】知识点梳理(三)
前端·typescript