JavaScript 是前端开发中的核心语言,面试中经常会问到一些关于 JavaScript 的基础和高级特性的问题。以下是一些常见的 JavaScript 前端面试题及答案:
-
解释 JavaScript 中的
var、let和const之间的区别。var是函数作用域的,会提升到函数顶部;let和const是块级作用域的,不存在变量提升。const用于声明常量。
-
JavaScript 中的闭包是什么?
- 闭包是指那些能够访问自由变量的函数。自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量。
-
如何实现深拷贝和浅拷贝?
- 浅拷贝复制对象的引用,而深拷贝递归复制对象的所有属性。可以通过
JSON.parse(JSON.stringify(object))实现浅拷贝,深拷贝可以通过递归遍历对象。
- 浅拷贝复制对象的引用,而深拷贝递归复制对象的所有属性。可以通过
-
null和undefined有什么区别?null表示故意赋予变量的空值,而undefined表示变量已声明但尚未赋值。
-
==和===在比较时有什么区别?==比较的是值的相等性,会进行类型转换;===比较的是值和类型的相等性,不会进行类型转换。
-
JavaScript 中的原型继承是如何工作的?
- 原型继承是基于原型链的,每个对象都有一个内部属性(
[[Prototype]]),指向它的原型。
- 原型继承是基于原型链的,每个对象都有一个内部属性(
-
如何实现一个私有变量?
- 可以使用闭包或者 ES6+ 中的
Symbol类型和WeakMap来实现。
- 可以使用闭包或者 ES6+ 中的
-
解释
this在 JavaScript 中的工作原理。this的值取决于函数的调用方式。在对象的方法中,this指向该对象;在事件处理中,this指向触发事件的元素。
-
什么是 IIFE?
- IIFE 表示立即调用的函数表达式,它在定义后会立即执行。
-
JavaScript 中的事件冒泡和事件捕获是什么?
- 事件冒泡是从子元素向父元素传递事件,事件捕获则是从父元素向子元素传递事件。
-
如何阻止事件冒泡和默认行为?
- 使用
event.stopPropagation()阻止冒泡,使用event.preventDefault()阻止默认行为。
- 使用
-
什么是单线程和多线程?JavaScript 中如何实现多线程?
- JavaScript 单线程避免了并发问题,但可以使用 Web Workers 实现多线程。
-
解释 JavaScript 中的异步编程。
- 异步编程包括回调函数、Promises、async/await 等。
-
如何使用 Promise 来实现异步编程?
- Promise 是一种用于异步操作的对象,它有
pending、fulfilled和rejected三种状态。
- Promise 是一种用于异步操作的对象,它有
-
async和await是如何工作的?async用于声明一个异步函数,await用于等待一个 Promise 的解决。
-
什么是防抖(debounce)和节流(throttle)?
- 防抖是确保函数在指定时间内最多只执行一次,节流则是在指定时间内最多只执行一次。
-
如何操作 DOM?
- 使用
document.getElementById()、document.querySelector()等方法操作 DOM。
- 使用
-
如何实现数组的去重?
- 使用
Set对象或者filter方法。
- 使用
-
JavaScript 中的模块是什么?
- 模块是一种封装代码的方式,可以使用 CommonJS、AMD、ES6 模块等。
-
如何优化 JavaScript 性能?
- 避免不必要的全局查找、使用适当的数据结构、缓存DOM查询结果等。
-
如何调试 JavaScript 代码?
- 使用浏览器的开发者工具,如 Chrome DevTools。
-
解释 JavaScript 中的作用域链。
- 作用域链是保证执行环境有权访问外层函数变量的机制。
-
如何实现一个自定义事件?
- 使用
new CustomEvent()创建自定义事件,然后使用dispatchEvent()方法触发。
- 使用
-
JavaScript 中的
box-sizing属性有什么作用?box-sizing属性定义了如何计算元素的总宽度和总高度,可以是content-box(默认值)或border-box。
-
解释 JavaScript 中的原型继承和组合继承的区别。
- 原型继承是通过原型链实现继承,组合继承是将原型继承和基于类的继承相结合。
这些问题覆盖了 JavaScript 的多个核心概念和高级特性,是面试中常见的考察点。