了解三元运算符中按位运算符的使用

问题描述 投票:0回答:1

我刚刚学习如何编码,在研究排序算法时,有人要求我“看看是否可以将 if 和 else 块中的两行合并为一行,以使代码看起来更干净一些。”

const merge = (leftArray, rightArray) => {
  const sortedArray = [];
  while (leftArray.length > 0 && rightArray.length > 0) {
    if (leftArray[0] < rightArray[0]) {
      sortedArray.push(leftArray[0]);
      leftArray.shift();
    } else {
      sortedArray.push(rightArray[0]);
      rightArray.shift();
    }
  }

我首先想到的是使用三元运算符,然后,出于某种原因(以前从未见过这样做),我认为我可以针对每个条件采取这两个操作,并用“&&”将它们连接起来那会起作用的。

但是我打错字了!!我写了“&”而不是“&&”,令我惊讶的是,即使这样它也按预期工作。但我不知道为什么,找不到任何东西可以解释它实际上是如何工作的以及为什么。 (下面是所有代码和我重写的部分)。

const mergeSort = (startArray) => {
  const length = startArray.length;
  if (length === 1) {
    return startArray;
  }
  
  const mid = Math.floor(length / 2);
  const leftArray = startArray.slice(0, mid);
  const rightArray = startArray.slice(mid, length);

  return merge(mergeSort(leftArray), mergeSort(rightArray))
}

const merge = (leftArray, rightArray) => {
  const sortedArray = [];
  while (leftArray.length > 0 & rightArray.length > 0) {
    leftArray[0] < rightArray[0] ? 
    sortedArray.push(leftArray[0]) & leftArray.shift() : 
    sortedArray.push(rightArray[0]) & rightArray.shift()
  }
  
  return sortedArray.concat(leftArray).concat(rightArray);
}

如果有人能对此有所启发,我将不胜感激。

javascript bitwise-operators conditional-operator
1个回答
0
投票

&&
是一个比较器。在这种情况下,
&
&&
会执行完全相同的操作(可能除了一些边缘情况之外),但这主要是因为您没有按预期使用它们。让我解释一下。

&
是位运算符。它需要两个数字并对每个数字中的每一位进行按位与运算以生成结果。您的代码之所以有效,是因为您实际上并未对按位与的输出执行任何操作。相反,您的目标只是运行两个函数。

您在这里告诉 JS 要做的就是获取这两个函数的输出并将它们相与在一起。但是,为了获得函数的输出,JS 必须执行它们。因此,当它看到这个块时,它会调用这两个函数,然后它还会对输出进行按位与运算(尽管您看不到这一点,因为您没有对输出执行任何操作)。在您的情况下,这工作得很好,因为这两个函数最终都会被调用,并且您会得到预期的输出。

© www.soinside.com 2019 - 2024. All rights reserved.