美文网首页
JavaScript中in运算符使用的问题

JavaScript中in运算符使用的问题

作者: 高冷a | 来源:发表于2017-08-06 21:53 被阅读0次

    在编写一个数组去重的代码的时候遇到一个问题

    //正确代码
    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]

    相关文章

      网友评论

          本文标题:JavaScript中in运算符使用的问题

          本文链接:https://www.haomeiwen.com/subject/grmnlxtx.html