如何准备JavaScript面试:完整指南
\n\nJavaScript面试不是学校考试,不需要死记硬背答案。这是一场对话,不仅考察你对语法的掌握,还检验你的思维能力、对语言机制的理解以及解决实际问题的能力。如果你觉得在闭包上“含糊不清”,混淆了this,害怕事件循环——别担心。我们准备了一份结构化的指南,帮助你自信地通过JavaScript面试。
为什么准备JS面试这么难?
\n\nJavaScript是一门有灵魂(有时也有惊喜)的语言。同一个函数可能根据上下文表现出不同的行为。因此,在JavaScript面试中,他们不仅会问“代码输出什么”,还会要求你解释为什么。而正是在这里,许多人会失败。但我们会教你如何抓住这些陷阱。
\n\n1. 必须牢记的基础知识
\n\n数据类型和类型转换
\n\n从基础开始。JavaScript有7种原始类型:string、number、boolean、null、undefined、symbol、bigint——以及一种复杂类型:object。但巧妙之处在于,typeof null返回"object"——这是一个历史错误,你需要知道。
在JavaScript面试中,他们喜欢问隐式类型转换。例如:
\n\nconsole.log([] + []); // ""\nconsole.log([] + {}); // "[object Object]"\nconsole.log({} + []); // 0 (在浏览器控制台中)\n\n\n为什么会这样?因为+运算符试图将操作数转换为原始类型,调用toString()或valueOf()。记住:空数组变成空字符串,对象变成字符串"[object Object]"。
闭包和词法环境
\n\n这是JavaScript面试中最常见的主题之一。闭包是一个函数,它“记住”其外部作用域中的变量,即使外部函数已经执行完毕。
\n\nfunction createCounter() {\n let count = 0;\n return function() {\n count++;\n return count;\n };\n}\n\nconst counter = createCounter();\nconsole.log(counter()); // 1\nconsole.log(counter()); // 2\n\n在面试中,他们可能会要求你编写类似的函数,或解释为什么在带有var的循环中会出现经典问题:
for (var i = 0; i < 5; i++) {\n setTimeout(() => console.log(i), 1000);\n}\n// 输出 5, 5, 5, 5, 5\n\n解决方案是使用let或将其包装在闭包中。务必解释var具有函数作用域,而不是块级作用域。
2. “This”——每个JS开发者的痛与乐
\n\n关于thisthis的值取决于函数如何被调用,而不是在哪里声明。
- \n
- 在全局上下文中(浏览器中),
this是window。 \n - 在对象的方法中,
this是对象本身。 \n - 在构造函数中,
this是新实例。 \n - 在箭头函数中,
this来自外部词法环境。 \n
面试示例:
\n\nconst obj = {\n name: "JS",\n getName: function() {\n return this.name;\n }\n};\n\nconst fn = obj.getName;\nconsole.log(fn()); // undefined (上下文丢失)\n\n如何修复?使用bind、call、apply或箭头函数。
3. 事件循环和异步——高级主题
\n\n如果不理解事件循环,你无法通过中级JavaScript面试。记住顺序:首先执行所有同步代码(栈