为什么我需要一个有点聪明的运算符来访问最后一个数组元素?

Why do I need a bit wise Operator to access the last array element?

我有下面的代码,它应该像这样在数组中找到两个字符串之间的交集 ["1, 3, 4, 7, 13", "1, 2, 4, 13, 15"] 它应该给出结果:1,4,13

  function FindIntersection(strArr) { 

    const firstArr = strArr[0].split(", ");
    const secondArr = strArr[1].split(", ");

    let newArr = [];
    let i = 0;
    let j = 0;


    while(i < firstArr.length && j < secondArr.length) {
      let a = firstArr[i] | 0;
      let b = secondArr[j] | 0;
      if(a === b) {
        newArr.push(a);
        i++;
        j++;
      } else if(a > b) {
        j++;
      } else if (b > a) {
        i++;
      }
    }

    strArr = newArr.join(",");

    return strArr; 

}

当我不使用按位运算符时 | 0 为什么不能正确访问数组中的最后一个元素? 按位运算符是如何解决这个问题的?

您不需要显式位运算符,只需将其转换为整数即可。如评论中所述,这只是触发将字符串转换为整数的一种方式。

typeof('str' | 0) === 'number'

但这很糟糕,对吧,因为 'str' 可能存在错误。我会更明确地使用:

let a = parseInt(firstArr[i], 10);

如果它不是有效的整数,那将是 return NaN,而 NaN === NaNfalse,所以你不会不小心将它添加到 [=16] =].

明确地说,您不是使用按位运算符访问数组元素,而是使用 ij 中的数字访问元素,然后您使用按位或将元素转换为数字。

将数字字符串转换为数字的其他几种方法:

"3" | 0 -> 3
"3" * 1 -> 3
+"3" -> 3
parseInt("3") -> 3

它可以将字符串转换为数字,parseInt 也可以工作

  function FindIntersection(strArr) { 

    const firstArr = strArr[0].split(", ");
    const secondArr = strArr[1].split(", ");

    let newArr = [];
    let i = 0;
    let j = 0;


    while(i < firstArr.length && j < secondArr.length) { 
      let a = parseInt(firstArr[i]);
      let b = parseInt(secondArr[j]);
      if(a === b) {
        newArr.push(a);
        i++;
        j++;
      } else if(a > b) {
        j++;
      } else if (b > a) {
        i++;
      }
    }

    strArr = newArr.join(",");

    return strArr; 

}

通过使用 Number 对象,这种方式也有效

  function FindIntersection(strArr) { 

    const firstArr = strArr[0].split(", ");
    const secondArr = strArr[1].split(", ");

    let newArr = [];
    let i = 0;
    let j = 0;


    while(i < firstArr.length && j < secondArr.length) { 
      let a = Number(firstArr[i]);
      let b = Number(secondArr[j]);
      if(a === b) {
        newArr.push(a);
        i++;
        j++;
      } else if(a > b) {
        j++;
      } else if (b > a) {
        i++;
      }
    }

    strArr = newArr.join(",");

    return strArr; 

}

console.log(FindIntersection(["1, 3, 4, 7, 13", "1, 2, 4, 13, 15"]));