(a ==1 && a== 2 && a==3) 有可能是 true 吗?

一个有趣的问题:

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

这是一道我被某科技公司问到的面试题。发生在两周之前,我仍然在努力寻找答案。

我知道我们从来不会在日常工作中写出这样的代码,但我对问题的答案仍然十分很好奇。

解法一:

利用松散相等运算符 == 的工作原理,你可以简单地创建一个带有自定义toString( 或者 valueOf)函数的对象,在每一次使用它时候改变它所的返回值,使其满足所有三个条件。

>之所以会得到如此结果,是由于表达式中使用了松散相等的运算符 ==。使用松散相等时,如果其中一个操作数与另一个类型不同,则 JS 引擎将尝试将一个操作转换为另一个类型。在左边对象、右边的数字的情况下,它会尝试将对象转换为一个数,首先通过调用 valueOf 如果是可调用的。否则,它会调用toString方法。我使用toString仅仅是因为它是我的第一反应,valueOf 会更合理。如果我不从toString返回一个字符串(而是返回数字),JS 引擎会尝试将字符串转换为一个数字,虽然有一个稍长的路径,但它仍然会给我们同样的结果。

解法二:

我不可否认——其他答案无疑是正确的,但你真的不能过错下面的代码:

请注意if 语句中的奇怪间距。它是半宽度韩文=,=。这是一个 Unicode 空格字符,但是 ECMAScript 不将其解释为一个空格 —— 这意味着它是一个有效的标识符。因此有三个完全不同的变量,一个是a后加半宽度韩文,一个是a, 一个是a前加半宽度韩文。。。

用下划线 _ 替代半宽度韩文,增加可读性,相同的代码看起来像这样:

解法三:

这是完全可能的!

使用一个get,让 a 的返回值为三个不同的值。然而这并不意味着我们应该在真正的代码中使用。。。

And so on …

总结

1. 利用松散相等运算符 == 的原理,自定义 toStringvalueOf 返回对应值

2. 利用半宽度韩文等特殊字符,玩“障眼法”,本质上其实并没有做到题设

3. 劫持 JS 对象的 getter,不过这种方式对于严格相等 === 同样有效

3 1 收藏 7 评论

相关文章

可能感兴趣的话题



直接登录
最新评论
  • wang90   01/31

    第一个方法走通了,但是二和三复制过去运行没有没有看到想要的答案,

    另外能解释下一中,a这个对象里面2个键的意思吗?不太理解

    • 夏~   02/07

      a对象是的原型链上默认有 valueOf(), toString() 方法, 当前这个定义里的 toString()方法是用来覆盖原型上那个 toString()方法

      这样 在 做 a==1 && a==2 && a==3 的判断时, 每次相等判断时, a 会做 先调用 valueOf()方法,但这个方法返回了 a对象自己, 所以就接着调用它的 toString()方法,它返回一个数字,这个数字会用于相等比较

      这样每次判断, 属性 i 都被自加了, 所以 a==1 && a==2 && a==3 它的结果 会是 true

  • 阿九 前端攻城狮 02/18

    下意识也是想到了第三种解法

  • 厉害了,受益良多

  • 爱喝曼特宁的程序猿 前端 03/04

    第一种方法没怎么看懂,可以解释一下吗?谢谢

    • ,   04/04

      == 操作会先调用 valueOf, 然后调用toString, 然后后置++,第一次返回是的1,第二次是2, 第三次是3

跳到底部
返回顶部