javascript - array.includes doesn't work when checking if an iterator exists in array
问题描述
I'm encountering some unexpected behavior in my JavaScript code which I'd like to understand. I want a one-line function to detect if a number exists inside an array of integers. The number being checked is the iterator of a loop in another array. I'm using the standard includes()
function, should note the same happens with an indexOf() >= 0
check. For this test we have the following code:
const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for(let i in array1)
console.log(array2.includes(i));
To my surprise each output returns false
instead of the expected false true true false
sequence. How can this be? I know I'm checking i
not arr[i]
, but i
still corresponds to the numbers included in those arrays: 0 is still 0, 1 is still 1, etc. Using arr.includes(1)
does return true, so why not arr.includes(i)
when i
is also 1?
解决方案
A for...in
loops through all the keys/properties.
It is a string, not number, which comes from the bracket property accessor
const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for(let i in array1)
console.log(typeof i, i, array2.includes(i));
A for...of
loops through the values if the object is an iterable, defined by some function that I don't know off the top of my head and isn't important right now.
const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for(let i of array1)
console.log(typeof i, i, array2.includes(i));
Also know that your for...in
loop doesn't do what you seem to expect it to do when array1
isn't an incrementing integer list starting at 0:
const array1 = [6, 4, 3, 95, 45, 3, 3];
for(let i in array1)
console.log(typeof i, i);
So what you should do is just use for...of
(or Array.prototype.forEach
, or a traditional for (let i = 0; i < arr.length; i++)
loop, etc.) unless you need a for...in
(which is almost never), or in this case I guess you can cast the string to a number before checking if it's called on Array.prototype.includes
const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for(let i in array1)
console.log(i, array2.includes(parseInt(i)));
推荐阅读
- html - 如何在我的 ascx 页面上的超链接前面添加普通文本
- stripe-payments - 将 SCA 实施到 Stripe 实施中
- bash - zsh 上的错误:docker:来自守护进程的错误响应:无效的卷规范
- linux - EasyApache4 更新覆盖 htaccess 文件
- python - Instagram 媒体链接上的 Python 请求返回 Not Found 错误
- css - 为什么绝对定位元素会查看其兄弟元素?
- go - 运行 golang 调试器时,VSCode 调试不在 VARIABLES 区域中显示映射值
- python - 使用 Dask DataFrame loc 更改列值
- css - 有没有办法通过css为选定单元格的行着色?
- graphql - 创建包含不同其他项目数组的项目的突变