加班准备走...
在 twitter 上看到了个有意思的问题
我觉得如果有人说自己熟悉 es6 的话, 可以用这个来打脸
let x = 0;
async function test() {
x += await 2;
console.log(x)
};
test();
x+=1;
console.log(x);
这里输出了什么? 又是为什么呢?
答案:
https://www.youtube.com/watch?time_continue=278&v=bfxglBVSNDI
ps: 用这种题目做面试题估计又会被人说是造火箭吧. 我倒是觉得面试造火箭没啥错, 万一哪天在拧火箭的螺丝呢?
原文: https://twitter.com/jaffathecake/status/999269332889763840
1
ericls 2018-05-24 22:05:26 +08:00 via iPhone
这个当面试题? 你为啥不问茴香豆的几种写法?
|
2
shuizhengqi 2018-05-24 22:15:03 +08:00
@ericls 4 种
|
4
whileFalse 2018-05-24 22:17:19 +08:00 2
谁要写出这样的代码,并且用它的特性正确地实现了想要的功能,
就地打死 |
6
yu099 2018-05-24 22:20:17 +08:00 via Android 1
绝对打回去重写
|
7
murmur 2018-05-24 22:35:38 +08:00
写这种代码的人建议枪毙 15 分钟
|
9
chairuosen 2018-05-24 22:53:27 +08:00 7
这个问题换个问法可能会合适一些。“我告诉你输出是 1,2,你来分析为什么。”
问输出什么,好像在考你知不知道这个坑,不知道的永远不知道,我知道所以你 Low ? 问为什么输出这个,是在考解决问题的能力,即使没有踩过这个坑,也能靠自己能力分析出来。 |
10
fulvaz OP @ericls
@shuizhengqi @whileFalse @yu099 @murmur @chairuosen 楼上的各位, 如果你们认真看了视频, 或者直接拉到最后, 你会发现这是现实中存在的问题, 而不是 js 游戏 |
11
yangbin9317 2018-05-25 01:25:45 +08:00 1
其实我有点奇怪竟然有人会不知道答案
|
12
bobsam 2018-05-25 02:12:33 +08:00 via iPhone
实际中不会有这种代码的,这主要是考察 async,await 的知识点,还有异步调用。答不出没关系,这只是说明你基础不扎实,那既然这样我就换个知识点考察。如果答出来了,我就会问你实际应用时,这种情况会是怎样,我会要求你说出一个实际例子了。因为你了解知识点,但是你没应用,那也只是靠背,没啥意思。
|
13
ericls 2018-05-25 03:13:54 +08:00 via iPhone
@fulvaz 参考 10 楼
或者换一个问法 告诉输出的前提下 给你 2 分钟时间 不限方式 搞明白为什么 能力不是给你一堆代码 让你给出结果 而是给你输入 给你输出 让你实现 还有在过程中 可能有输出和预期有差别的时候 怎么 debug 怎么搞明白为什么 |
14
murmur 2018-05-25 08:28:38 +08:00
@fulvaz 直接拉到最后作者说了一句不要把异步和同步混用
然后再回到那个真的问题,也就是所谓的计算目录文件大小 首先所有的 file 方法都有 sync 的,这样就避免了 sync 和 async 混用的问题 然后学的不多的,或者不喜欢语法糖的,会用 promise.all->then 或者 promise 数组 reduce 执行,这样也不存在例子里的问题 这个题最恶心之处是他考的 JS 奇葩的执行方式,x += await 2;这句的 2 在 await,即便是没用过 await 的也能猜出跟 timeout 一个套路的考题,但是这个题更恶心之处在于 2 在 await,但是 x 不会重新执行 |
15
murmur 2018-05-25 08:35:35 +08:00
另外就视频里的那个问题
生产怎么解决? 本着 npm 万能和不造轮子的原则 google 输入 npm directory size 我发现第一个是 get-folder-size 周下载 1w 多 最近还在更新 问题完美解决 就是这样 node 生态发展这么多年 当你一个很简单很普通跟业务不搭边能用语言描述出来的需求 一定有人造了轮子 而且比你的语法糖更好 |
16
SergeGao 2018-05-25 09:38:26 +08:00
async 是 es2017 标准,所以应该不算 es6 吧?
|
17
notreami 2018-05-25 09:52:17 +08:00
后端菜鸟觉得应该是
1 1 |
18
murmur 2018-05-25 09:57:32 +08:00
@SergeGao 2016 年,3 阶段草稿是应该算 es2017 吧
不过对于前端来说只要 babel 能搞定的都叫 es6...实际上是这样的..多新的特性都有人往生产上用 |
19
zj299792458 2018-05-25 10:00:04 +08:00 via iPhone
es6 是啥,看不懂……
|
20
lauix 2018-05-25 10:17:13 +08:00 1
第一想法 是 1,2。第二个想法是 1,3。 看了下答案,我第二想法貌似是正确的。
|
21
pheyer 2018-05-25 10:21:52 +08:00 1
这题应该这么考才对:
let x = 0; async function test() { console.log(x); x += await 2; console.log(x) }; test(); x+=1; console.log(x); 答案是多少? |
24
nino 2018-05-25 10:47:18 +08:00
这个题有点坑
|
25
cstome 2018-05-25 11:16:58 +08:00
前端面试——总有一道题能问到你。
|
27
miketeam 2018-05-25 11:25:12 +08:00 via iPhone 2
先进的文化总是在寻找共识,协调一致。垃圾文化老是在装逼秀智商
|
28
bigggge 2018-05-25 11:51:35 +08:00
相当于这样吧
let x = 0; function* test () { x += yield 2; console.log(x); } let t = test(); Promise.resolve(t.next().value) .then(v => { t.next(v); }); x += 1; console.log(x); |
29
murmur 2018-05-25 12:22:53 +08:00
@SergeGao x += async2 这句只阻塞了后面 前面的 x 没有重新计算 进了函数体的时候 x 是 0 然后 async2 阻塞 去运行函数外面的第一个 console 然后回来继续执行 x 没有重新计算 所以 0+2 还是 2
这种东西没踩过一次坑谁会用这么恶心的特性 |
30
murmur 2018-05-25 12:23:19 +08:00
更正 async->await
|
31
binux 2018-05-25 12:28:42 +08:00 3
你确定这不是未定义行为?如果 += 是一个原子操作呢?
例如编译成非 async 时,+= 是原子操作,展开成 a = await 2; x += a; 了呢? |
32
binux 2018-05-25 12:30:31 +08:00 4
|
33
cjyang1128 2018-05-25 12:36:23 +08:00
|
34
leekafai 2018-05-25 12:39:37 +08:00
楼上兴奋吐槽的可以先进去视频看看,视频里面是有应用场景的。
|
36
gongbaodd 2018-05-25 16:29:43 +08:00
我发现了一个更有意思的是事情,babel 编译之后执行结果就不一样了
|
37
John60676 2018-05-25 17:34:11 +08:00 2
|
38
natural 2018-05-25 18:00:02 +08:00
求别遇到一个有坑的就想着拿来当面试题
|
39
gjquoiai 2018-05-25 21:10:23 +08:00 1
我觉得楼主理解错造火箭的意思了,你这是问螺丝有几个旋儿
|
40
xiaojie668329 2018-05-25 21:15:58 +08:00 via iPhone
这个有啥吐槽的,基本的考你对 async await 的理解程度。上面还一堆打死人的也是醉了。
|
41
xqin 2018-05-25 22:22:40 +08:00
不用 += 就可以得 1, 3
``` let x = 0; async function test() { x = (await 2) + x; console.log(x) }; test(); x+=1; console.log(x); ``` youtube 那个朋友的问题, 换成 ``` totalSize = (await getSize(file)) + totalSize ``` 就可以解决. 把 await 放面. |
42
xqin 2018-05-25 22:37:07 +08:00
另外这个问题, 本身并不是 await 引起的, 而是 赋值语句 计算值 是从左向右的这个过程产生的效果.
具体可参考这个: https://twitter.com/KyleDavidE/status/999625457816555520 ``` let val = 0; function inc1(){ val++; console.log(val); return 2; } function inc2(){ val += inc1(); console.log(val); } inc2(); ``` --- ``` let val = 0; function inc1(){ val++; console.log(val); return 2; } function inc2(){ val = inc1() + val; console.log(val); } inc2(); ``` |
43
xqin 2018-05-25 22:40:43 +08:00
再者这个问题和 es6 一毛钱关系都没有, 所以拿这个题来打脸, 并不是打的 es6 这个点, 而是 js 基础知识.
|
44
murmur 2018-05-25 22:56:24 +08:00
@xqin 那你用 es5 的语法来解释下为什么 x+=await 2 这句吧
let x = 0; function test() { x += 2; console.log(x) }; setTimeout(test, 0); x+=1; console.log(x); 这是 js 基础的理解版 1 和 3 的答案 也就是能考虑到 await 的 2 个阻塞 x 重新计算了 但是你从 es5 的哪一条能解释清楚 await2 阻塞了但是回来的时候 x 的值并没有重新计算 |
46
rabbbit 2018-05-26 00:15:13 +08:00
|
47
byztl 2018-05-26 15:01:48 +08:00 via iPhone
let 不是常量吗?
|
48
0x11901 2018-05-26 23:25:21 +08:00
第一感觉是 1,3
打开浏览器 console 试了下是 1、2 估计这就是我为什么讨厌 js 的原因 |
49
Exin 2018-06-09 15:57:29 +08:00
哎,倒在了 `+=` 上面
|