TypeScript中为何!==可正常工作而===在函数内失效?
问题原因分析
核心问题出在对every方法的逻辑理解上:every会遍历数组所有元素,只有当所有回调函数的返回值都是true时,整个方法才返回true;只要有一个元素让回调返回false,every就会立刻返回false。
用!==的过滤逻辑(变量s)
这段代码的逻辑是:筛选出数组a中,id与数组b里所有元素的id都不相等的项。
- 比如
a中id为4、1的元素,遍历b的所有元素时,它们的id确实和b里的5、6、2、3都不匹配,所以every返回true,这些项被保留下来,符合“找出a中不在b里的元素”的预期。 - 而
a中id为2、3的元素,遍历b时会遇到相同id的元素,此时回调返回false,every整体返回false,这些项被过滤掉,逻辑正确。
用===的过滤逻辑(变量r)
这段代码的逻辑是:筛选出数组a中,id与数组b里每一个元素的id都相等的项。
- 但
b里的元素id分别是5、6、2、3,没有任何一个a的元素id能同时等于这四个不同的值,所以every永远返回false,最终filter的结果就是空数组,这就是它不符合预期的原因。
如果想实现“找出a中存在于b里的元素”
应该把every换成some(some只要有一个元素让回调返回true,就整体返回true),代码如下:
const r = a.filter(({ id: idv }) => b.some(({ id: idc }) => idv === idc)); console.log(r); // 输出 [{id: 2, name: 'John'}, {id: 3, name: 'Matt'}]
内容的提问来源于stack exchange,提问作者Kirubha Kavi
相关产品推荐
相关产品推荐

