Are you an LLM? You can read better optimized documentation at /vite-press/interview/04-JavaScript.md for this page in Markdown format
JavaScript 面试题
1. JavaScript 中的数据类型?存储上的差别?
- 原始类型:
Number、String、Boolean、undefined、null、Symbol、BigInt - 引用类型:
Object、Array、Function、等
存储差别:
- 原始类型存储在栈中,值不可变。
- 引用类型存储在堆中,栈中存放的是指针地址。
2. JS 数据结构
- 数组、对象、集合(Set)、映射(Map)
- 栈、队列、链表、树、图(需自定义实现)
3. DOM 常见操作
- 获取:
getElementById、querySelector - 修改内容:
innerHTML、textContent - 操作属性:
setAttribute、classList - 插入/删除节点:
appendChild、removeChild
4. BOM 及常见对象
- BOM 是浏览器对象模型,代表浏览器窗口。
- 常见对象:
window、navigator、location、history、screen
5. == 与 === 区别
==会进行类型转换===不会,类型和值都需相等
建议:始终使用 ===
6. typeof 与 instanceof 区别
typeof用于原始类型判断instanceof用于引用类型判断
js
typeof [] // "object"
[] instanceof Array // true1
2
2
7. 原型与原型链
- 每个函数有
prototype - 每个对象有
__proto__ - 原型链用于属性查找机制
8. 作用域链理解
- JavaScript 使用词法作用域
- 内部函数可以访问外部函数作用域
- 多层嵌套作用域形成作用域链
9. this 对象理解
- 普通函数:指向全局或 undefined(严格模式)
- 对象方法:指向该对象
- 箭头函数:没有自己的 this,继承外层作用域
- 构造函数:指向新实例
10. new 操作符做了什么?
- 创建空对象
- 设置原型连接
- 调用构造函数
- 返回对象(或构造函数返回的对象)
11. bind、call、apply 区别?实现 bind?
call立即调用,参数逗号分隔apply立即调用,参数为数组bind返回新函数
js
Function.prototype.myBind = function (ctx, ...args) {
const fn = this
return function (...rest) {
return fn.apply(ctx, [ ...args, ...rest ])
}
}1
2
3
4
5
6
2
3
4
5
6
12. 执行上下文与执行栈
- 执行上下文:代码执行的环境(全局、函数、eval)
- 执行栈:记录执行上下文的栈结构,先进后出
13. JS 的事件模型
- 捕获阶段
- 目标阶段
- 冒泡阶段(默认)
14. 事件代理
- 将事件绑定到父元素,利用事件冒泡处理子元素事件
应用场景: 动态列表、表格行点击等
15. 闭包理解与应用
- 闭包:函数访问其外层作用域的变量
- 应用:私有变量、异步回调、函数工厂、缓存等
16. 类型转换机制
- 隐式:
==比较、运算 - 显式:
Number()、String()、Boolean()、parseInt()
17. 深拷贝与浅拷贝
- 浅拷贝:只复制一层
- 深拷贝:递归复制所有层级
ts
function deepClone(obj, map = new WeakMap()) {
if (typeof obj !== 'object' || obj === null) return obj
if (map.has(obj)) return map.get(obj)
const clone = Array.isArray(obj) ? [] : {}
map.set(obj, clone)
for (const key in obj) {
clone[key] = deepClone(obj[key], map)
}
return clone
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
18. 字符串常用方法
length、charAt()、indexOf()、includes()replace()、slice()、substr()、split()toUpperCase()、trim()
19. 数组常用方法
- 修改类:
push、pop、shift、unshift、splice - 遍历类:
forEach、map、filter、reduce - 查找类:
find、includes、indexOf - 其他:
sort、reverse、concat、join、flat
20. 事件循环理解
- 执行同步任务
- 清空微任务队列(
Promise) - 执行宏任务(
setTimeout、setInterval、setImmediate)
循环执行以上步骤
21. AJAX 原理与实现
- 异步请求数据无需刷新页面
- 原理基于
XMLHttpRequest或fetch
js
function ajax({ url, method = 'GET', data = null }) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()
xhr.open(method, url, true)
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
xhr.status >= 200 && xhr.status < 300
? resolve(xhr.responseText)
: reject(xhr.statusText)
}
}
xhr.send(data)
})
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14