javascript - (a== 1 && a ==2 && a==3) 可以评估为真吗?

标签 javascript ecmascript-6

Moderator note: Please resist the urge to edit the code or remove this notice. The pattern of whitespace may be part of the question and therefore should not be tampered with unnecessarily. If you are in the "whitespace is insignificant" camp, you should be able to accept the code as is.

(a== 1 && a ==2 && a==3) 是否有可能在 JavaScript 中计算为 true

这是一家大型科技公司提出的面试问题。它发生在两周前,但我仍在努力寻找答案。我知道我们在日常工作中从未编写过这样的代码,但我很好奇。

最佳答案

如果您利用 how == works ,您可以简单地使用自定义 toString(或 valueOf)函数创建一个对象,该函数会在每次使用时更改返回的内容,从而满足所有三个条件。

const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}


之所以可行,是因为使用了松散相等运算符。使用松散相等时,如果其中一个操作数的类型与另一个不同,引擎将尝试将一个操作数转换为另一个。对于左侧的对象和右侧的数字,它将尝试通过首先调用 valueOf 将对象转换为数字,如果它是可调用的,如果失败,它将调用 toString。在这种情况下,我使用 toString 只是因为想到的是,valueOf 会更有意义。如果我改为从 toString 返回一个字符串,然后引擎会尝试将该字符串转换为一个数字,从而为我们提供相同的最终结果,但路径稍长。

关于javascript - (a== 1 && a ==2 && a==3) 可以评估为真吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270127/

相关文章:

php - 在 map 上显示 GPS 位置数据

javascript - 获取 Url 字符串参数作为 JSON 对象

javascript - chrome 中 Canvas 填充颜色错误

javascript - 在 goBack() react 路由器 v4 之前检查历史记录之前的位置

javascript - 处理数组时使用扩展语法 (...) 和 push.apply 之间的区别

javascript - 创建组件时如何设置key?

使用 AJAX 时 JavaScript 打印失败

javascript - 调用 jQuery Extend 中的另一个方法

javascript - 以键作为箭头函数参数的 ES6 对象

javascript - let关键字中的unicode转义是否有效