代码之家  ›  专栏  ›  技术社区  ›  Nguyễn Văn Phong Murtaza Patrawala

在Javascript中a===1&&a===2&a===3是否可能返回true?

  •  0
  • Nguyễn Văn Phong Murtaza Patrawala  · 技术社区  · 4 年前

    Can (a== 1 && a ==2 && a==3) ever evaluate to true?

    我们可能知道 loose equality operator (==) 将尝试将这两个值转换为公共类型。因此,将调用某些函数。

    ToPrimitive(A) 通过调用不同的 A.toString A.valueOf

    所以下面的代码将按预期工作。

    const a = {
      i: 1,
      toString: function () {
        return a.i++;
      }
    }
    
    if(a == 1 && a == 2 && a == 3) {
      console.log('Never catch!');
    }

    然而,问题在于 strict equality (===) . 方法,例如 .valueOf , .toString ,或 Symbol.toPrimitive

    const a = {
      i: 1,
      toString: function () {
        return a.i++;
      }
    }
    
    if(a === 1 && a === 2 && a === 3) {
      console.log('Never catch!');
    }
    1 回复  |  直到 4 年前
        1
  •  6
  •   CertainPerformance    4 年前

    另一页上的一些方法是严格相等的,只是避免使用 toString valueOf

    let num = 1;
    Object.defineProperty(window, 'a', { get() { return num++ } });
    // or use `with` and an object with a getter instead of putting it on the window
    
    if(a === 1 && a === 2 && a === 3) {
      console.log('Never catch!');
    }

    这是因为 a 不是普通变量-它是窗口上的getter,所以当标识符 则getter运行并可以返回任何值。在这里,它将返回一个递增的整数。

    如果您希望允许,链接问题中的其他方法将严格平等地工作: