JavaScript 语言的核心足够大,以至于很容易误解其某些部分的工作方式。我最近在重构一些使用 方法的代码时发现,我实际上并没有完全理解其背后的逻辑。在我的脑海中,我假设回调函数必须被调用并返回 , 才会返回 ,但实际情况并非如此。对于一个空数组, 无论回调函数是什么都会返回 ,因为那个回调函数从未被调用。考虑以下情况:
在这个例子的每种情况下,调用 都是为了检查数组中的每一项是否为数字。前四个调用相当直接, 产生了预期的结果。现在考虑这些例子:
这可能更令人惊讶:无论是返回 还是 的回调,结果都是一样的。唯一的原因是如果回调没有被调用, 的默认值是 。但是,为什么一个空数组会对 返回 ,当没有值去执行回调函数时呢?
要理解原因,重要的是要看看规范是如何描述这个方法的。
ECMA-262 定义了一个 算法,大致可以翻译成以下的 JavaScript 代码:
从代码中可以看到, 假设结果是 ,并且只有当回调函数对数组中的任何一个条目返回 时,才会返回 。如果数组中没有条目,则没有执行回调函数的机会,因此,该方法无法返回 。
现在的问题是: 为什么会这样表现呢?
MDN 页面提供了为什么 对一个空数组返回 的答案:
every 表现得像数学中的“全称量词”。特别是对于一个空数组,它返回 true。(空集合中的所有元素默认满足任何给定条件是一种空洞真理。)
空洞真理 是指如果给定条件(称为前提)不能满足(即,给定条件不是真的),那么某事是真的。把它转回 JavaScript 方面, 对一个空集返回 是因为没有办法调用回调。回调代表要测试的条件,如果因为数组中没有值而无法执行它,则 必须返回 。
“全称量词”是数学中一个更大主题的一部分,称为普遍量化,它允许你对数据集合进行推理。鉴于 JavaScript 数组在执行数学计算中的重要性,尤其是与类型化数组一起使用,自然会支持这种操作。而且 不是唯一的例子。
JavaScript 的 方法实现了存在量化(“存在”有时也称为“存在”或“对于某些”)中的“存在”量词。"存在" 量词声明,对于任何空集合,结果是假。因此, 方法对一个空集返回 ,并且它也不执行回调。这里有一些例子(双关语):
JavaScript 不是唯一一个为集合或迭代器实现了量化方法的编程语言:
- Python: 函数实现了“全称” ,而 函数实现了“存在”。
- Rust: 方法实现了“全称”,而 方法实现了“存在”。
因此,JavaScript 凭借 和 与众不同。
不管你是否认为 的行为违反直觉,这都是值得讨论的。然而,不管你的观点如何,你都需要意识到 的“全称”本质,以避免错误。简而言之,如果你使用 或可能为空的数组时,你应该事先进行明确的检查。例如,如果你有一个依赖数字数组的操作,而空数组会导致操作失败,那么你应该在使用 之前检查数组是否为空:
再次强调,只有当你有一个不应该在空的时候用于操作的数组时,这个额外的检查才是重要的;否则,你可以避免这个额外的检查。
虽然我对 对一个空数组的行为感到惊讶,但一旦你理解了这个操作的更广泛上下文以及这个功能在不同语言中的普及,这就讲得通了。如果你对这个行为也感到困惑,那么我建议你在遇到 调用时改变你的阅读方式。不要把 看作是“这个数组的每一项是否满足这个条件?”而是看作是,“数组中是否有任何一项不满足这个条件?”这种思维的转变可以帮助你避免未来在你的 JavaScript 代码中出现错误。
原文作者:Nicholas C. Zakas (https://humanwhocodes.com/blog/2023/09/javascript-wtf-why-does-every-return-true-for-empty-array/)
到此这篇关于JavaScript空数组的every()方法实践的文章就介绍到这了,更多相关JavaScript空数组every()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
到此这篇数组方法every(数组方法filter)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/75983.html