同学,这道题你会做吗?

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 团队校招已经开始了,还等什么?!赶紧扫描下方二维码找师兄内推啊!

9691 次点击
所在节点    程序员
84 条回复
SimbaPeng
2018-08-10 11:45:07 +08:00
明显就是考察你的基础知识,你连这题都答不出来的话,凭什么让面试官相信你不会因为对 js 的某些‘糟粕’特性不熟悉而在实际代码中引入 BUG ?
bilibiliQQ
2018-08-10 11:46:48 +08:00
dddd1919
2018-08-10 12:20:16 +08:00
废话不多说,有这样一个问题:console.log(a == 1 && a == 2 && a == 3) 运行之后是否可能输出 true 呢?


不是应该输出 a is not defined 么
molvqingtai
2018-08-10 12:25:29 +08:00
怎么不把 JavaScript 真值表扣几个空让面试者填上🙃
zdliu
2018-08-10 12:29:03 +08:00
变量都不初始化
kljsandjb
2018-08-10 12:32:34 +08:00
就感觉专门为了面试而去硬想的为难人的题目
whileFalse
2018-08-10 12:33:34 +08:00
怎么不说 override console.log 呢。
hzwjz
2018-08-10 12:37:37 +08:00
面试的时候,有这样子的问题,写代码的时候也这样子吗🙃
Eoss
2018-08-10 12:42:51 +08:00
@SimbaPeng 还基础知识?既然是糟粕,就是让人去避开的,而不是去专研为什么。只要知道,并且不用就够了。

且不说比较没用===,就直接去修改默认的 toString 方法也是厉害。

我还想为 console.log(a === 1 && a === 2 && a === 3) 运行之后是否可能输出 true 呢。

来啊。互相伤害啊。要不要再重写下 console.log ,让它 console.log(anyting) 输入 true 呢?
VoidChen
2018-08-10 12:49:57 +08:00
我觉得楼上的是不是都太僵硬了,思想太僵硬,这种题答不出来没人会说你菜啊,但是你连思路都没有就开始去否定它,是不是太固执了?明明是挺有意思的一道题目,a 的类型就是你发挥想象力的点,还有人说没有去定义它,兄 dei,就是要你去定义这个对象啊。。。
kisnows
2018-08-10 12:52:01 +08:00
直接用 === ,谢谢,这种面试题没有任何意义。
VoidChen
2018-08-10 12:53:54 +08:00
举个经典例子,你硬盘上有 100G 文件,里面全是完全乱序的数字,但是你的内存只有 10G,是否有可能去排序并输出成另一个文件。发挥想象力才是编程最有趣的地方吧
kendricklamar
2018-08-10 12:55:53 +08:00
@SimbaPeng 文言文怎么就没用了?你一个中国人一点古籍都不看?
snailsir
2018-08-10 12:56:40 +08:00
没有任何意义
vjnjc
2018-08-10 12:57:12 +08:00
其实是个招聘贴
kendricklamar
2018-08-10 12:59:43 +08:00
@SimbaPeng JS 有些个面试题是真的不知道有啥意义,就是把 JS 的「糟粕」拿出来考你,然而平时根本不会按面试题那样去写。
ZZITE
2018-08-10 13:00:24 +08:00
第一反应就是利用类型转换、重写转换方法、调用递增。还以为有点取巧了,结果看答案就是这样啊 - -
tinywhale
2018-08-10 13:00:40 +08:00
@bilibiliQQ 看颜色是 Illustrator 做的,3D 软件渲染出来的颜色不会这么僵硬
leafiy
2018-08-10 13:01:11 +08:00
console.log = ()=>{return true}
console.log("fuck") //true
unforgiven
2018-08-10 13:15:04 +08:00
@qiutianaimeili 我认为这样的奇技淫巧,反而恰恰说明了 js 自身的不严谨

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

https://www.v2ex.com/t/478515

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

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

© 2021 V2EX