在编写一个数组去重的代码的时候遇到一个问题
//正确代码
let a = [1,2,3,4,2,3,4,4,7];
let b = [];
a.map(value => {
if (b.indexOf(value) !=== -1) ;
else b.push(value);
})
//b = [1,2,3,4,7];
这里使用map方法遍历数组,在方法内赋值,不涉及回调函数的返回值问题,纯粹的将map方法代替一个for循环来遍历数组,个人觉得这样代码简洁一些
但是当时忘记了indexOf
这个方法,而是使用了in运算符,代码如下:
//错误代码
let a = [1,2,3,4,2,3,4,4,7];
let b = [];
a.map(value => {
if (value in b) ;
else b.push(value);
})
//b = [1,2,3,4,4,7];
很明显,上面的代码发生了错误。
在上面的代码中,我理所当然的将in
运算符的意思理解为英文的in,使用if
语句来判断collection
中的value
是否存在,即判断a数组中的元素存在b数组中。这种用法错误的曲解了in的意思。
在JavaScript中,使用in
运算符,若后面跟的是数组,则前面的参数表示的是数组的下标
因此,在上述错误代码中,实际发生的情况是:
1.value=1,判断b[1]是否存在,由于b此时是一个空数组,于是执行else
将1存入b数组中,结果b = [1]
2.value=2,判断b[2]是否存在,由于此时b=[1],于是执行else
将2存入b数组中,结果b=[1,2]
3.value=3,判断b[3]是否存在,由于此时b=[1,2],于是执行else
将3存入b数组中,结果b=[1,2,3]
4.value=4,判断b[4]是否存在,由于此时b=[1,2,3],于是执行else
将4存入b数组中,结果b=[1,2,3,4]
5.value=2,判断b[2]是否存在,由于此时b=[1,2,3,4],于是不执行任何操作,结果b=[1,2,3,4]
6.value=3,判断b[3]是否存在,由于此时b=[1,2,3,4],于是不执行任何操作,结果b=[1,2,3,4]
7.value=4,判断b[4]是否存在,由于此时b=[1,2,3,4],执行else
将4存入b数组中,结果b=[1,2,3,4,4]
8.value=4,判断b[4]是否存在,由于此时b=[1,2,3,4,4],于是不执行任何操作,结果b=[1,2,3,4,4]
9.value=7,判断b[7]是否存在,由于此时b=[1,2,3,4,4],于是else
将7存入b数组中,结果b=[1,2,3,4,4,7]
最后返回结果b=[1,2,3,4,4,7]