同学,这道题你会做吗?

2018-08-10 10:45:42 +08:00
 xcold

又到了新的收获 (offer) 的季节,当前秋招正如火如荼,各位少侠是否在忙着准备面试和前端的技术题呢?

题目介绍

今天小编给大家出道题考考大家的 JavaScript 基础,如果你先知先觉,说明一定做足了功课,万一后知后觉猜到了答案,也别忘了给个点赞打赏小编这一番“深入浅出”的操作。

废话不多说,有这样一个问题:console.log(a == 1 && a == 2 && a == 3) 运行之后是否可能输出 true 呢?

问题剖析

近看之这像是一个自相矛盾的结果,不大可能出现,但直觉告诉我们这种__看上去不可以又问你可不可以的问题__答案通常都是可以!那么问题的关键就是找到那个符合条件的变量 a。接下来我们逐步拆解这个问题:

  1. 变量 a 可能是什么类型?

JavaScript 里面有 Undefined、Null、Boolean、Number、String、Symbol 六种基本类型和 Object 类型。

  1. 这几种基本类型的值和数字进行比较,使用 == 运算符,可能发生类型转换。具体转换规则如下表:

如果 a 是 undefind 或者 null,比较结果是 false。 如果 a 是 Number 类型,直接和 1、2、3 比较,无法同时满足连续相等。 如果 a 是 Boolean 类型,会先转换成数字然后进行比较。具体规则是 true 转化为 1,false 转化为 0。也无法实现连续相等。 如果 a 是 String 类型,也会先转换为数字再进行比较。一个字符串可以转换成一个数字或 NaN,不满足条件。 如果 a 是 Object 类型,会先转换成基础值( Number、String、Boolean ),用基础值再去比较。当转换成基础值的时候会调用对象的 toString 或 valueOf 方法。好像可以!

  1. 有没有办法让 a 在每一次运算之后递增? 这个比较简单,在 valueOf 或者 toString 方法返回值的时候递增就可以了。

想明白上面的问题之后,很自然地可以得到下面的实现。

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

回顾总结

回顾一下剖析问题的整个过程,才发现这道题里面考察了很多前端基础,比如:

  1. JavaScript 里面有哪些数据类型?
  2. == 和 === 有什么区别?
  3. 不同类型之间进行比较转换的规则是怎样的?
  4. undefined 和 null 有什么区别?
  5. 对象相关的知识点...

面试题如同跟考试一样,刷题的时候如果能够举一反三多思考,能够很好地帮助我们查漏补缺,巩固基础。这个问题还有许多其他巧妙的解法(甚至你可以试图改造 console.log ),大家不妨试一试。

[1] 题目来源:https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true [2] 表格来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using

阿里巴巴 TXD 团队校招已经开始了,还等什么?!赶紧扫描下方二维码找师兄内推啊!

9882 次点击
所在节点    程序员
84 条回复
nigelvon
2018-08-10 16:00:46 +08:00
问这种题的公司应该不考虑。
newtype0092
2018-08-10 16:07:57 +08:00
@SimbaPeng 我学文言文也不会学茴香豆的“茴”的四种写法啊。。。
dilu
2018-08-10 16:15:39 +08:00
都是这样,面试造航母,工作拧螺丝。

世界上面试中文的问题,80%是用不到,或者说不知道也不太影响干活的,反正百度一下总能掌握点基础,唯一能考察出来的就是基础是否扎实,经验是否老道,但是这些真的不影响干活。

反而那种不管什么都能很快学会上手甚至短期内就能熟练精通的人才难招。
Eoss
2018-08-10 16:38:51 +08:00
@SimbaPeng 就算面试官想知道应聘者是否对此了解。直接了当的问“==和===的区别,==带来的隐患,你什么时候使用==什么时候使用===,为什么不用==而是用===,举几个你踩过==的坑”之类的问题,我觉得足够好了。

何必奇葩到去重写对象的默认方法。

如果这一题允许重写内置属性方法。那么是否后面的面试都要考虑属性方法的重写?
那么对于上面的第四题“ undefined 和 null 有什么区别?”,是否可以答“没区别。”?因为我可以

var undefined = null
undefined === null
NonClockworkChen
2018-08-10 16:43:46 +08:00
校招可以这么问,社招人家以为你们冒充阿里。
chezs66
2018-08-10 16:53:25 +08:00
let a = {
_val: 1,
[Symbol.toPrimitive]() {
return a._val++;
},
};
console.log(a == 1 && a == 2 && a == 3); // true
unknownservice
2018-08-10 16:55:07 +08:00
@NonClockworkChen 上次有个猎头推的阿里职位 某个面试官就问了我 null 和 undefined 看来阿里果然好这口
1762628386
2018-08-10 16:55:56 +08:00
拉到底部果然看见广告了
xcold
2018-08-10 16:56:45 +08:00
@bilibiliQQ 是俺们内部造的个小工具,生成 2.5D 特色二维码用的~
SimbaPeng
2018-08-10 17:12:14 +08:00
@Eoss 直接问?你上学的时候老师教你 1+1=2,考试就考 1+1 等于几?不会在一个应用题里的埋下多个知识点考察?甚至还放一些烟雾弹来迷惑你的思路?就像你那样直接问,谁知道你是不是就是死记硬背了这些东西,知其然而不知所以然,说的时候倒背如流,用得时候原形毕露?

另外这题是个开放题,又没有标准答案,面试官更多是看你的解题思路,从你的解题思路中面试官能看出你的思路够不够灵活、语言是否足够熟悉、基础够不够扎实,岂是仅问==和===的区别能比的?
SimbaPeng
2018-08-10 17:17:59 +08:00
@Eoss
> 如果这一题允许重写内置属性方法。那么是否后面的面试都要考虑属性方法的重写?

开放题有开放题的解法,常规题有常规题的解法。你连这么基本的审时度势的能力都没有吗?
你要是上学的时候用这种钻牛角尖的学习方式能考上高中吗?
jason19659
2018-08-10 17:20:35 +08:00
console.log = function() {console.info(true)}
谁面试面这个会被打死
molvqingtai
2018-08-10 21:35:02 +08:00
@SimbaPeng "==" ESlint 都跑不过,还 code review?
Akarin
2018-08-10 22:34:59 +08:00
既然这么喜欢奇技淫巧,那更多的约束也没关系吧?

```
Object.freeze(console);

const a = _________; // 2

console.log(a === Symbol()); // 3
```

请在 2 横线处填入*表达式*,使得 3 输出为 `true`
hjlmjx
2018-08-10 23:03:48 +08:00
小时候学的是 1+1=2,后来长大了,听说 1+1 不等于 2 的结论,再后来又听说了 1+1 大于 2 的思想,再后来看到 xx 大牛证明出了 1+1=x 的思路。妈的好高级,我咋也没看见现在小孩子的课本上 1+1 大于 2 ?
zhzer
2018-08-10 23:09:37 +08:00
面这种真的有点无语,可惜都喜欢问
毕竟面试造核弹,工作看文档
djxf
2018-08-10 23:10:52 +08:00
精彩哈哈😄😄你们继续打
skadi
2018-08-10 23:25:01 +08:00
mdzz
lovedebug
2018-08-10 23:29:02 +08:00
a 都没有声明,难道在严格模式下不报错? 非严格模式不是 undefined 的吗? 🤔
SimbaPeng
2018-08-11 00:44:52 +08:00
@molvqingtai 你所知道的只有==?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/478515

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX