前端JS中常见的面试题
以下是几个常见的 JavaScript 面试题:
1. 创建对象的几种方式
JavaScript 中创建对象的几种方式有:字面量、构造函数、Object.create()、class 等。其中字面量是最简单和最常见的创建对象的方式,构造函数可以通过工厂模式或者原型链来实现复用,Object.create() 可以通过指定原型对象来创建新对象,class 是 ES6 提供的语法糖,本质上还是实现了原型继承。
来源链接:[1]
2. 作用域链的原理
JavaScript 中作用域链是由当前执行环境与其父层执行环境组成的,在命名冲突时,内部执行环境可以访问外部执行环境中的变量,反之则不行。在查找变量值时,JavaScript 引擎会优先在当前执行环境中查找,如果没有找到,则会向父级执行环境继续查找,逐级向上直至全局执行环境。如果在全局执行环境中还没有找到,则会返回 undefined。
来源链接:[1]
3. 常见的数据类型
JavaScript 中的数据类型包括:基本数据类型(Number、String、Boolean、Null、Undefined、Symbol)和引用数据类型(Object)。其中,Number 类型表示数字,String 类型表示字符串,Boolean 类型表示布尔值,Null 表示空值,Undefined 表示未定义,Symbol 用于表示唯一的值,Object 可以表示对象、数组、函数等复杂类型。
来源链接:[2]
4. this 的指向问题
在 JavaScript 中,this 的指向是根据函数的调用方式动态决定的。当直接调用函数时,this 指向全局对象 window,当函数作为某个对象的方法被调用时,this 指向该对象。此外,在使用 call、apply、bind 方法时可以显式地改变函数的 this 指向。
来源链接:[2]
5. 闭包的概念和作用
闭包是指一个函数能够访问另一个函数内部定义的变量,即使这个函数已经执行完毕,仍然可以通过闭包来访问这些变量。闭包可以用来创建私有变量、实现函数柯里化、缓存计算结果等。但同时,由于闭包会占用内存,如果滥用闭包会导致内存泄漏和性能问题。
来源链接:[2]
6. 什么是事件冒泡和事件捕获
事件冒泡是指当一个元素触发某个事件时,该事件会从该元素开始向父级元素一直传递,直到传递到 document 对象。而事件捕获则是相反的过程,即从 document 对象开始向下传递,直到传递到触发该事件的元素。DOM 标准规定,首先按照捕获的方式处理事件,然后再按照冒泡的方式处理事件。不过,可以通过 stopPropagation 和 preventDefault 方法来停止事件的传递和默认行为。
来源链接:[1]
7. 什么是异步编程,如何实现异步编程
异步编程是指在程序执行过程中不会阻塞其他代码的执行,而是在后台执行。在 JavaScript 中,异步编程主要通过回调、Promise、async/await 等机制来实现。其中,回调是最早也是最简单的实现方式,但由于回调函数嵌套层级深、错误处理难以维护等问题,推出了 Promise 和 async/await 两种更为高级的异步编程方案。
来源链接:[2]
8. 什么是闭包,它有什么作用和缺点
闭包是指一个函数能够访问另一个函数内部定义的变量,即使这个函数已经执行完毕,仍然可以通过闭包来访问这些变量。闭包可以用来创建私有变量、实现函数柯里化、缓存计算结果等。但同时,由于闭包会占用内存,如果滥用闭包会导致内存泄漏和性能问题。
来源链接:[3]
9. 如何实现数组去重
JavaScript 中实现数组去重主要有以下几种方式:
- 利用 Set 数据结构去重
- 利用对象属性名不能重复的特性去重
- 利用 Array.filter() 方法去重
- 利用 Array.reduce() 方法去重
以上这些方式都可以达到去重的效果,但实际应用时需要根据具体场景进行选择。
来源链接:[4]
10. call、apply 和 bind 的作用和区别
call、apply 和 bind 都是 JavaScript 中用来改变函数 this 指向的方法。它们的基本作用都是一样的,都是用来调用函数并修改函数中的 this 指向。其中,call 和 apply 的区别在于传入参数的形式不同,call 方法的参数是一个一个传入,apply 方法的参数是以数组的形式传入。而 bind 方法则是返回一个新函数,并将 this 指向绑定到指定对象上,不会立即执行。
来源链接:[5]

浙公网安备 33010602011771号