首页

Javascript

Html
Css
Node.js
Electron
移动开发
小程序
工具类
服务端
浏览器相关
前端收藏
其他
关于
公司注册

有意思的JavaScript面试题:如何让(a ==1 && a== 2 && a==3) 的值为true

2019年10月23日 发布 阅读(2157) 作者:Jerman

这是一道在StackOverflow上看到的面试题,内容主要为:

JavaScript如何让(a ==1 && a== 2 && a==3)的值为true。

StackOverflow上的几个答案:

重写Object的toString或者valueOf

  1. const a = {
  2. i: 1,
  3. toString: function () {
  4. return a.i++;
  5. }
  6. }
  7. if(a == 1 && a == 2 && a == 3) {
  8. console.log('Hello World!');
  9. }

Object类型与Number类型的==比较,Object类型会转换为数字类型后再和数字比较。

A为Object类型,B为Number类型,A==B实际是

  1. ToPrimitive(A) == B

ToPrimitive(A)会尝试调用A.toString()和A.valueOf()方法来获取A对应的数字基本类型。

定义”a”属性,并重写它的getter方法

  1. const value = function* () {
  2. let i = 0;
  3. while(true) yield ++i;
  4. }();
  5. Object.defineProperty(this, 'a', {
  6. get() {
  7. return value.next().value;
  8. }
  9. });
  10. if (a === 1 && a === 2 && a === 3) {
  11. console.log('yo!');
  12. }

Object.defineProperty()定义”a”为this的属性,并定义了a属性的getter方法。这样在条件语句里使用的a,实际为this的属性a。

这里使用了ES6新增的特性:Generator函数来产生value。

字符编码

有很好几个答案都是利用了Unicode的字符编码:同义字和隐形字符。

同义字示例

  1. var a = 1;
  2. var a = 2;
  3. var a = 3;
  4. if(aᅠ==1 && a== 2 &&ᅠa==3) {
  5. console.log("Why hello there!")
  6. }

隐形字符

  1. var a = 1;
  2. var a = 2;
  3. var a = 3;
  4. console.log(a == 1 && a == 2 && a == 3);
  5. /****
  6. var a = 1;
  7. var a\u200c = 2;
  8. var a\u200d = 3;
  9. console.log(a == 1 && a\u200c == 2 && a\u200d == 3);
  10. ****/

数组toString隐含调用join()方法

  1. a = [1,2,3];
  2. a.join = a.shift;
  3. console.log(a == 1 && a == 2 && a == 3);

这方法没有重写getter和toString/valueOf,它利用了数组的toString会隐含调用Array.join方法。

重写toString方法

  1. var a = {
  2. i:1,
  3. toString(){return a.i++}
  4. }
  5. if(a == 1 && a == 2 && a ==3){
  6. console.log(1)
  7. }

更详细查看StackOverflow问题:https://stackoverflow.com/questions/48270127/can\-a\-1\-a\-2\-a\-3\-ever\-evaluate\-to\-true

版权声明:本站文章除特别声明外,均采用署名-非商业性使用-禁止演绎 4.0 国际 许可协议,如需转载,请注明出处