「校招记录」字节跳动一面
什么也不会,直接干懵了。
正文
- 先自我介绍一下。
- 你这些项目都是自己鼓捣的吗?是的。然后就没问这些项目的事情了。
- 仓鼠(我的舍友)说是面试官觉得 To-do List 没必要问。
- 答题环节(代码测试环节之后还问了一些,就直接合并到这里吧)。
- JS:
var
、const
和let
的区别。- 就答了变量提升、块级作用域。实际还有很多没答。
- “为什么
const
指向的对象是可以改变的?”回答:不太懂,但是 JS 里指向对象都是引用,而指向的那个对象都是可改变的,要不改变需要Object.freeze
。- 这个也是浅
freeze
,如果要完全冻结要手写递归。 - “有没有别的方法?”没答出来,可以用
Object.defineProperty(obj, prop, { enumerable: false, configurable: false, writable: false, value: val });
,或者在类里面修改set
。
- 这个也是浅
- 简单介绍一下原型链。答了获取属性的过程。
- “
__proto__
和prototype
的区别?”“原型是对象吗,原型的构造方法是对象吗?”都没答上来。- 前者:
__proto__
是Object
(实例)的属性,指向构造函数的原型对象;prototype
是Function
(构造方法)的属性,指向原型对象。- e.g.
const foo = new Foo();
则foo.__proto__ === Foo.prototype
,Foo.__proto__ = function.prototype
。
- e.g.
- 后者:都是对象,JS 除简单数据类型,一切皆对象。
- 前者:
- “
- 介绍一下
this
。答错了。this
永远指向调用它的对象。- 构造函数中写
this.x = 1
则必须要用new f();
才会更改this
到这个对象,不然this
指向全局对象。 - 补充:构造函数如果返回一个
object
且不是null
,则返回值会覆盖前面做的所有改动。
- 构造函数中写
- 特殊情况:箭头函数中的
this
指向定义时的this
,编译时就已经确定死了,不适用这一条件(类似于直接做了个bind
)。
- 看你写过
Promise/A+
,介绍一下Promise
。- 回答可以用来替代若干个回调的
setTimeout
,面试官还问我你确定是替代setTimeout
吗,我说是吧。实际上并不是,是替代任意含有回调的异步函数的。
- 回答可以用来替代若干个回调的
- CSS:
position
的取值,忘了fixed
,也不知道relative
的用法。float
的应用,没用过。- BFC,不会。
- 块级元素和行内元素的区别,没答完整。
- 给
inline
元素设置margin-top
有用吗,不知道。
- 给
- React:
- 问了
diff
算法,不会,没问了。
- 问了
- Linux:
- 问文件读写权限,只答说有
rwx
和三种用户类别(实际上是所有者 / 所有者所在用户组 / 其他人),没问了。
- 问文件读写权限,只答说有
- Git:
- 问了
git rebase
,不会,没问了。
- 问了
- HTTP:不会。计网是真的一点没看。
- JS:
- 代码测试环节。
- JS 题:实现
Promise.all
,并写一些小测试。- 应该是比较好地完成了。
- 过程中还问了一下
Promise.all
和Promise.allSettled
的区别,问返回值,不知道后者有返回值。 - 没给
counter
加锁(参见尾注)。
- 算法题:求最长上升子序列。
- 写了 $O(n^2)$ 的 DP 算法。
- 写完发现要求返回的是一个合法解而不是长度,再改。
- 没写 $O(n \log n)$ 算法,面试官没问,我想着没问就不说了。
- 仓鼠说要答,有简单贪心 + 二分算法,况且如果说了数据结构 + DP 面试官不知道也会加一点点分。
- CSS 题:
tranform: translate(10px) rotate(135deg);
和transform: rotate(135deg) translate(10px);
一样吗?没见过transform
,不会。
- JS 题:实现
- 有没有什么想问面试官。想了半天想不出来,感觉自己不会的东西太多太多了,面试像在做压力测试,都是想了半天不会。
感想
面试官人其实很好,甚至问了 git rebase
这种明显送分的题。
基础很不扎实,多准备准备再来吧 TAT
尾注
- 关于
Promise.all
的加锁:后来查阅了一下,原生 Javascript 是单线程语言,async / await
其实也是单线程实现的。只要保证操作能在单个事件循环内完成就不会出现这种问题(参见 async-lock#why-do-you-need-locking-on-single-threaded-nodejs)。