源本科技 | 码上会

JavaScript 数据结构与类型

2026/04/05
1
0

深拷贝与浅拷贝的区别

浅拷贝和深拷贝的核心区别在于是否复制引用类型的深层数据。浅拷贝只复制对象或数组的第一层,对于嵌套的引用类型(对象、数组),只复制内存地址,新旧对象会共享深层数据,修改其中一个,另一个也会跟着变,常用Object.assign、扩展运算符...实现。深拷贝会递归复制所有层级的数据,完全开辟新的内存空间,新旧对象没有任何关联,互不影响,常用JSON.parse(JSON.stringify)、递归函数、第三方库实现。浅拷贝性能高但只适合单层数据,深拷贝适合复杂嵌套数据,能彻底避免数据污染。

JavaScript中的Symbol类型是什么及其用途

Symbol 是 ES6 新增的原始数据类型,用来生成一个全局唯一、不可修改的值,不会出现重复。通过Symbol()创建,每个 Symbol 值都是独一无二的,即使描述相同,值也不相等。它的主要用途:作为对象的唯一属性名,避免属性名冲突;模拟对象的私有属性,防止外部随意修改;用作内置对象的元编程标识,实现自定义迭代逻辑等。Symbol 不属于对象,没有构造函数,不能用new创建,是解决属性名冲突、实现私有成员的重要类型。

JavaScript中的Symbol内置符号属性

JS 提供了多个内置 Symbol 符号,用于暴露对象的底层逻辑,实现元编程。常用的有:Symbol.iterator,定义对象的默认迭代器,使对象可被for...of遍历;Symbol.hasInstance,用于instanceof判断,自定义实例检测逻辑;Symbol.toStringTag,修改Object.prototype.toString的返回结果;Symbol.isConcatSpreadable,控制数组concat时是否展开;Symbol.matchSymbol.replace等,自定义字符串匹配逻辑。这些内置符号让开发者能干预 JS 的原生行为,扩展对象的核心功能。

如何在JavaScript中创建和使用Map对象

Map 是 ES6 的键值对集合,创建方式是const map = new Map()。常用方法:map.set(key, value)添加键值对,键可以是任意类型(对象、函数、基本类型);map.get(key)获取对应值;map.has(key)判断键是否存在;map.delete(key)删除指定键;map.clear()清空所有数据。遍历方式有for...offorEach,还可通过keys()values()entries()获取迭代器。Map记住键的插入顺序,适合存储有序、键类型多样的键值对数据,比普通对象更灵活。

JavaScript中Map和Object的区别

Map 和 Object 都是键值对结构,但核心差异很大。键类型:Object 只能用字符串、Symbol 作键,Map 支持任意类型(对象、数组、函数)。有序性:Object 无序(ES6 后部分有序),Map严格保留插入顺序。大小获取:Map 直接用size属性,Object 需手动计算。键名冲突:Object 会覆盖原型链上的同名属性,Map 不会。性能:频繁增删键值对时,Map 性能更优。使用场景:简单键值对用 Object,键类型复杂、需要有序、频繁操作的场景用 Map。

解释JavaScript中的Set对象及其用途

Set 是 ES6 的无序、不重复集合,用来存储唯一值,基本类型和引用类型都能存,自动去重。创建方式const set = new Set(),常用方法:add(value)添加值,delete(value)删除值,has(value)判断是否存在,clear()清空。主要用途:数组 / 字符串去重,比如[...new Set(arr)];实现交集、并集、差集等集合运算;存储不重复的唯一标识,避免重复数据。Set 没有键,只有值,遍历方式和 Map 类似,是处理唯一数据的高效工具。

JavaScript中的WeakMap和Map的区别

WeakMap 是 Map 的弱引用版本,核心区别在引用和垃圾回收。键的类型:WeakMap只接受对象作为键,Map 支持任意类型。引用方式:WeakMap 对键是弱引用,键对象无其他引用时,会被垃圾回收自动清理,Map 是强引用,会阻止回收。功能限制:WeakMap不可遍历,没有sizekeys()forEach,Map 支持所有遍历和查询。用途:WeakMap 适合存储对象的私有数据、缓存,不影响垃圾回收,避免内存泄漏;Map 适合常规键值存储,功能更全面。

解释JavaScript中的Proxy对象及其用途

Proxy 是 ES6 的代理对象,用来拦截、自定义对象的核心操作,相当于在目标对象外层加一层拦截器。创建方式const proxy = new Proxy(target, handler),handler 中可定义get(读取)、set(赋值)、deleteProperty(删除)、apply(函数调用)等拦截方法。用途:实现数据响应式(Vue3 的核心);数据验证,限制非法赋值;日志记录,监控对象操作;实现私有属性、函数防抖节流等。Proxy 能拦截 13 种对象操作,功能强大,是 JS 元编程的核心工具。