前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。

前后端面试题-专栏总目录

在这里插入图片描述

文章目录

  • 一、本文面试题目录
      • 33. 什么是Symbol?它有什么特性?
      • 34. 如何创建一个Symbol类型的值?如何为其添加描述?
        • 一、创建Symbol值
        • 二、为Symbol添加描述
      • 35. Symbol作为对象属性有什么优势?如何获取对象的Symbol属性?
        • 一、Symbol作为对象属性的优势
        • 二、获取对象的Symbol属性
      • 36. Set和Map的区别是什么?分别适用于哪些场景?
        • 适用场景:
      • 37. Set如何实现数组去重?
        • 实现步骤:
        • 示例代码:
        • 原理:
      • 38. Map与对象(Object)相比有哪些优势?
      • 39. WeakSet和WeakMap的特性是什么?与Set、Map有何区别?
        • 一、核心特性(WeakSet和WeakMap共有的)
        • 二、与Set、Map的区别
        • 示例:
        • 适用场景:
      • 40. 如何遍历Set和Map中的元素?
        • 一、遍历Set
        • 二、遍历Map
        • 总结:
  • 二、80道ES6 面试题目录列表

一、本文面试题目录

33. 什么是Symbol?它有什么特性?

Symbol是ES6新增的一种原始数据类型,用于表示独一无二的值,不属于任何其他类型(如字符串、数字等)。它的核心特性如下:

  1. 唯一性:即使两个Symbol的描述相同,它们也是不同的。

    const s1 = Symbol("test");
    const s2 = Symbol("test");
    console.log(s1 === s2); // false
    
  2. 不可枚举性:Symbol作为对象属性时,不会被for...inObject.keys()等方法枚举,也不会被JSON.stringify()序列化。

    const obj = {[Symbol("id")]: 123,name: "test"
    };
    console.log(Object.keys(obj)); // ['name'](Symbol属性未被枚举)
    
  3. 不能与其他类型直接运算:Symbol值不能与字符串、数字等进行拼接或算术运算,否则会报错。

    const s = Symbol("a");
    // console.log(s + "b"); // TypeError: Cannot convert a Symbol value to a string
    
  4. 可作为对象属性的键:解决对象属性名冲突问题(如多模块协作时避免属性覆盖)。

  5. 无法被实例化:Symbol是原始类型,不能用new操作符创建(new Symbol()会报错)。

34. 如何创建一个Symbol类型的值?如何为其添加描述?

创建Symbol值的方式及添加描述的方法如下:

一、创建Symbol值

通过Symbol()函数创建,注意不能使用new关键字(因Symbol是原始类型,非对象)。

const s = Symbol(); // 创建一个无描述的Symbol
console.log(typeof s); // "symbol"(特殊的原始类型)
二、为Symbol添加描述

Symbol()函数可接收一个字符串作为描述(description),用于调试时区分不同的Symbol(不影响其唯一性)。

  1. 直接传入描述字符串

    const s1 = Symbol("userName"); // 描述为"userName"
    const s2 = Symbol("age");      // 描述为"age"
    
  2. 通过description属性获取描述

    console.log(s1.description); // "userName"(ES2019新增属性)
    
  3. 注意:描述相同的Symbol仍是不同的值:

    const s3 = Symbol("id");
    const s4 = Symbol("id");
    console.log(s3 === s4); // false(描述相同但值不同)
    
  4. 通过Symbol.for()创建全局共享的Symbol(特殊场景):
    若需要让描述相同的Symbol在全局范围内保持唯一,可使用Symbol.for(),它会在全局Symbol注册表中查找描述,存在则返回,否则创建新的并注册。

    const s5 = Symbol.for("globalKey");
    const s6 = Symbol.for("globalKey");
    console.log(s5 === s6); // true(全局共享,描述相同则值相同)
    console.log(Symbol.keyFor(s5)); // "globalKey"(获取全局Symbol的描述)
    

35. Symbol作为对象属性有什么优势?如何获取对象的Symbol属性?

一、Symbol作为对象属性的优势
  1. 避免属性名冲突
    Symbol的值唯一,即使属性名的描述相同,也不会覆盖已有属性(解决多模块协作或动态属性场景的冲突问题)。

    const moduleA = { [Symbol("id")]: 1 };
    const moduleB = { [Symbol("id")]: 2 };
    // 合并两个对象时,Symbol属性不会冲突
    const merged = { ...moduleA, ...moduleB };
    console.log(merged[Object.getOwnPropertySymbols(moduleA)[0]]); // 1(属性保留)
    
  2. 隐藏属性
    Symbol属性不会被for...inObject.keys()Object.values()枚举,适合定义“私有”属性(非真正私有,但不易被意外访问)。

    const obj = {public: "可见属性",[Symbol("private")]: "隐藏属性"
    };
    for (const key in obj) {console.log(key); // 仅输出"public"(Symbol属性被忽略)
    }
    
二、获取对象的Symbol属性

需使用专门的API获取:

  1. Object.getOwnPropertySymbols(obj)
    返回对象自身所有Symbol属性的数组。

    const s = Symbol("test");
    const obj = { [s]: "value" };
    const symbols = Object.getOwnPropertySymbols(obj);
    console.log(symbols); // [Symbol(test)]
    console.log(obj[symbols[0]]); // "value"(访问Symbol属性值)
    
  2. Reflect.ownKeys(obj)
    返回对象自身所有属性(包括字符串键和Symbol键)的数组。

    const obj = {a: 1,[Symbol("b")]: 2
    };
    console.log(Reflect.ownKeys(obj)); // ['a', Symbol(b)](包含所有键)
    

36. Set和Map的区别是什么?分别适用于哪些场景?

Set和Map是ES6新增的集合数据结构,核心区别及适用场景如下:

特性SetMap
存储内容唯一的(value)键值对(key-value),键唯一
本质无序的“值的集合”无序的“键值对集合”
常用APIadd()has()delete()sizeset()get()has()delete()size
键的特性无键,值本身具有唯一性键可以是任意类型(包括对象),且键唯一
遍历方式遍历值(values()keys()等价,因无键)遍历键、值或键值对(keys()values()entries()
适用场景:
  • Set

    • 存储不重复的值(如数组去重);
    • 实现数学中的“集合”操作(如交集、并集、差集);
    • 跟踪对象是否存在(如DOM节点的引用集合,避免重复操作)。
    // 数组去重
    const arr = [1, 2, 2, 3];
    const uniqueArr = [...new Set(arr)]; // [1, 2, 3]
    
  • Map

    • 需要键值对映射关系,且键不是字符串(如用对象作为键);
    • 存储复杂数据的关联关系(如缓存数据:键为请求URL,值为响应结果);
    • 频繁添加/删除键值对的场景(性能优于Object)。
    // 用对象作为键
    const objKey = { id: 1 };
    const map = new Map();
    map.set(objKey, "关联数据");
    console.log(map.get(objKey)); // "关联数据"
    

37. Set如何实现数组去重?

Set的核心特性是“存储唯一的值”(重复值会被自动忽略),利用这一特性可简洁实现数组去重。

实现步骤:
  1. 将数组转为Set(自动去重);
  2. 将Set转回数组(通过扩展运算符...Array.from())。
示例代码:
// 基础用法:去重基本类型值
const arr = [1, 2, 2, 3, 3, 3, "a", "a"];
const uniqueArr1 = [...new Set(arr)]; // 扩展运算符转换
const uniqueArr2 = Array.from(new Set(arr)); // Array.from转换
console.log(uniqueArr1); // [1, 2, 3, "a"]// 注意:无法去重引用类型(因对象的引用不同)
const obj1 = { id: 1 };
const obj2 = { id: 1 };
const arrWithObjects = [obj1, obj2, obj1];
const uniqueObjects = [...new Set(arrWithObjects)];
// 结果:[ {id:1}, {id:1}, {id:1} ](obj1和obj2引用不同,未去重)
原理:

Set判断值是否重复的逻辑与===类似,但有一个例外:NaN在Set中被视为相等(而NaN === NaNfalse)。

const arrWithNaN = [NaN, NaN, 1, 1];
console.log([...new Set(arrWithNaN)]); // [NaN, 1](NaN被去重)

38. Map与对象(Object)相比有哪些优势?

Map作为键值对集合,相比传统对象(Object)有以下优势:

  1. 键的类型更灵活
    Object的键只能是字符串或Symbol,而Map的键可以是任意类型(包括数字、对象、函数等)。

    const map = new Map();
    const objKey = { id: 1 };
    map.set(objKey, "value"); // 用对象作为键
    map.set(123, "number key"); // 用数字作为键
    
  2. 键的顺序更明确
    Map会保留键的插入顺序,而Object在ES6前不保证属性顺序(数字键会被优先排序)。

    const map = new Map();
    map.set("b", 2);
    map.set("a", 1);
    console.log([...map.keys()]); // ['b', 'a'](保留插入顺序)const obj = { b: 2, a: 1 };
    console.log(Object.keys(obj)); // ['b', 'a'](现代JS也保留顺序,但历史行为不一致)
    
  3. 更容易获取键值对数量
    Map通过size属性直接获取键值对数量,而Object需要手动计算(如Object.keys(obj).length)。

    const map = new Map([["a", 1], ["b", 2]]);
    console.log(map.size); // 2(直接获取)
    
  4. 更适合频繁添加/删除操作
    Map的set()delete()性能优于Object的属性添加/删除,尤其在键值对数量动态变化时。

  5. 避免原型链污染
    Object会继承原型链上的属性(如toStringhasOwnProperty),可能导致键名冲突;Map无原型链,仅包含自身键值对。

    const obj = {};
    console.log(obj["toString"]); // 函数(继承自原型)const map = new Map();
    console.log(map.has("toString")); // false(无继承属性)
    
  6. 遍历方式更统一
    Map原生支持迭代器,可直接用for...of遍历,而Object需要先获取键数组再遍历。

39. WeakSet和WeakMap的特性是什么?与Set、Map有何区别?

WeakSet和WeakMap是ES6新增的“弱引用”集合,特性及与Set、Map的区别如下:

一、核心特性(WeakSet和WeakMap共有的)
  1. 弱引用
    对存储的对象键(WeakMap)或值(WeakSet)保持弱引用,即不影响垃圾回收(GC)。若对象的其他引用被删除,Weak集合中的对象会被自动回收,释放内存。

  2. 不可枚举
    没有size属性,也不支持keys()values()等遍历方法,无法枚举其中的元素(因元素可能随时被GC回收)。

  3. 只能存储对象
    WeakSet的元素和WeakMap的键必须是对象(不能是原始类型,如数字、字符串)。

二、与Set、Map的区别
特性SetWeakSetMapWeakMap
存储内容任意类型的值仅对象(值)任意类型的键值对键必须是对象
引用类型强引用(阻止GC)弱引用(不阻止GC)强引用(键)弱引用(键)
可枚举性可枚举(有size)不可枚举(无size)可枚举(有size)不可枚举(无size)
常用APIadd/has/deleteadd/has/deleteset/get/has/deleteset/get/has/delete
适用场景去重、集合操作临时存储对象(如DOM节点)键值对映射关联对象元数据(不影响GC)
示例:
// WeakMap示例(键为对象,弱引用)
let obj = { id: 1 };
const weakMap = new WeakMap();
weakMap.set(obj, "metadata");obj = null; // 解除obj的引用,原对象会被GC回收,weakMap中对应的键值对也会消失// WeakSet示例(值为对象,弱引用)
let domNode = document.createElement("div");
const weakSet = new WeakSet();
weakSet.add(domNode);domNode = null; // DOM节点引用被解除,会被GC回收,weakSet中不再包含该节点
适用场景:
  • WeakSet:存储临时对象(如DOM节点),避免内存泄漏。
  • WeakMap:为对象添加元数据(如缓存对象的计算结果),不影响对象的生命周期。

40. 如何遍历Set和Map中的元素?

Set和Map均为可迭代对象(实现了[Symbol.iterator]),可通过多种方式遍历,具体方法如下:

一、遍历Set

Set存储的是“值的集合”,keys()values()返回的迭代器相同(因无键),常用values()或直接遍历。

  1. for...of循环(推荐):

    const set = new Set(["a", "b", "c"]);
    for (const value of set) {console.log(value); // "a" → "b" → "c"
    }
    
  2. forEach()方法

    set.forEach((value, key, self) => {// 注意:Set的forEach回调中,value和key参数相同(因无键)console.log(value); // "a" → "b" → "c"
    });
    
  3. 通过values()/keys()迭代器

    const values = set.values();
    console.log(values.next().value); // "a"
    console.log(values.next().value); // "b"
    
  4. 通过entries()迭代器(返回[value, value]形式的数组):

    for (const [value, sameValue] of set.entries()) {console.log(value, sameValue); // "a" "a" → "b" "b" → "c" "c"
    }
    
二、遍历Map

Map存储的是“键值对”,可分别遍历键、值或键值对。

  1. 遍历键值对(entries(),默认迭代器)

    const map = new Map([["name", "Alice"], ["age", 30]]);// for...of直接遍历(默认使用entries())
    for (const [key, value] of map) {console.log(`${key}: ${value}`); // "name: Alice" → "age: 30"
    }
    
  2. 遍历键(keys()

    for (const key of map.keys()) {console.log(key); // "name" → "age"
    }
    
  3. 遍历值(values()

    for (const value of map.values()) {console.log(value); // "Alice" → 30
    }
    
  4. forEach()方法

    map.forEach((value, key, self) => {console.log(`${key}: ${value}`); // "name: Alice" → "age: 30"
    });
    
总结:
  • Set的遍历以“值”为核心,方法简单;
  • Map的遍历可灵活选择键、值或键值对,适合不同场景(如仅需值时用values(),需键值关系时用entries())。

二、80道ES6 面试题目录列表

文章序号ES6 80道
1 ES6面试题及详细答案80道(01-05)
2 ES6面试题及详细答案80道(06-12)
3 ES6面试题及详细答案80道(13-21)
4 ES6面试题及详细答案80道(22-32)
5 ES6面试题及详细答案80道(33-40)
6 ES6面试题及详细答案80道(41-54)
7 ES6面试题及详细答案80道(55-61)
8 ES6面试题及详细答案80道(62-80)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96297.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96297.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96297.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PG-210-HI 山洪预警系统呼叫端:筑牢山区应急预警 “安全防线”

在山洪灾害多发的山区,及时、准确的预警信息传递是保障群众生命财产安全的关键。由 PG-210-HI 型号构成的山洪预警系统呼叫端主机,凭借其全面的功能、先进的特性与可靠的性能,成为连接管理员与群众的重要应急枢纽,为山区构建起一道…

研学旅游产品设计实训室:赋能产品落地,培养实用人才

1. 研学旅游产品设计实训室的定位与功能 研学旅游产品设计实训室是专门为学生提供研学课程与产品开发、模拟设计、项目推演、成果展示等实践活动的教学空间。该实训室应支持以下功能: 研学主题设计与目标制定; 课程内容与学习方法的选择与整合&#xf…

4215kg轻型载货汽车变速器设计cad+设计说明书

第一章 前言 3 1.1 变速器的发展环绕现状 3 1.2 本次设计目的和意义 4 第二章 传动机构布置方案分析及设计 5 2.1 传动机构结构分析与类型选择 5 2.2变速器主传动方案的选择 5 2.3 倒档传动方案 6 2..4 变速器零、部件结构方案设计 6 2.4.1 齿轮形式 …

9月10日

TCP客户端代码#include<myhead.h> #define SER_IP "192.168.108.179" //服务器&#xff49;&#xff50;地址 #define SER_PORT 8888 //服务器端口号 #define CLI_IP "192.168.108.239" //客户端&#xff49;&#xff50;地址 …

案例开发 - 日程管理 - 第七期

项目改造&#xff0c;进入 demo-schedule 项目中&#xff0c;下载 pinia 依赖在 main.js 中开启 piniaimport { createApp } from vue import App from ./App.vue import router from ./router/router.js import {createPinia} from pinialet pinia createPinia() const app …

infinityfree 网页连接内网穿透 localtunnel会换 还是用frp成功了

模型库首页 魔搭社区 fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. 我尝试用本机ipv6&#xff0c;失败了 配置文件 - ChmlFrp 香港2才能用 只支持https CNAME解析 | 怊猫科技 | 文档 How to create …

批量更新数据:Mybatis update foreach 和 update case when 写法及比较

在平常的开发工作中&#xff0c;我们经常需要批量更新数据&#xff0c;业务需要每次批量更新几千条数据&#xff0c;采用 update foreach 写法的时候&#xff0c;接口响应 10s 左右&#xff0c;优化后&#xff0c;采用 update ... case when 写法&#xff0c;接口响应 2s 左右。…

Java基础篇04:数组、二维数组

1 数组 数组是一个数据容器&#xff0c;可用来存储一批同类型的数据。 1.1 数组的定义方式 静态初始化 数据类型[][] 数组名 {元素1&#xff0c;元素2&#xff0c;元素3}; string[][] name {"wfs","jsc","qf"} 动态初始化 数据类型[][] 数组名…

unity开发类似个人网站空间

可以用 Unity 开发 “个人网站空间” 类工具&#xff0c;但需要结合其技术特性和适用场景来判断是否合适。以下从技术可行性、优势、局限性、适用场景四个方面具体分析&#xff1a;一、技术可行性Unity 本质是游戏引擎&#xff0c;但具备开发 “桌面应用” 和 “交互内容” 的能…

SDK游戏盾如何实现动态加密

SDK游戏盾的动态加密体系通过​​密钥动态管理、多层加密架构、协议混淆、AI自适应调整及设备绑定​​等多重机制协同作用&#xff0c;实现对游戏数据全生命周期的动态保护&#xff0c;有效抵御中间人攻击、协议破解、重放攻击等威胁。以下从核心技术与实现逻辑展开详细说明&am…

TensorFlow平台介绍

什么是 TensorFlow&#xff1f; TensorFlow 是一个由 Google Brain 团队 开发并维护的 开源、端到端机器学习平台。它的核心是一个强大的数值计算库&#xff0c;特别擅长于使用数据流图来表达复杂的计算任务&#xff0c;尤其适合大规模机器学习和深度学习模型的构建、训练和部署…

TENGJUN防水TYPE-C连接器:立贴结构与IPX7防护的精密融合

在户外电子、智能家居、车载设备等对连接可靠性与空间适配性要求严苛的场景中&#xff0c;连接器不仅是信号与电力传输的“桥梁”&#xff0c;更需抵御潮湿、粉尘等复杂环境的侵蚀。TENGJUN防水TYPE-C连接器以“双排立贴”为核心设计&#xff0c;融合锌合金底座、精准尺寸控制与…

Spring Boot + Vue 项目中使用 Redis 分布式锁案例

加锁使用命令&#xff1a;set lock_key unique_value NX PX 1000NX:等同于SETNX &#xff0c;只有键不存在时才能设置成功PX&#xff1a;设置键的过期时间为10秒unique_value&#xff1a;一个必须是唯一的随机值&#xff08;UUID&#xff09;&#xff0c;通常由客户端生成…

微信小程序携带token跳转h5, h5再返回微信小程序

需求: 在微信小程序内跳转到h5, 浏览完后点击返回按钮再返回到微信小程序中 微信小程序跳转h5: 微信小程序跳转h5,这个还是比较简单的, 但要注意细节 一、微信小程序代码 1.新建跳转h5页面, 新建文件夹,新建page即可 2.使用web-view标签 wxml页面 js页面 到此为止, 小程序…

【机器学习】通过tensorflow实现猫狗识别的深度学习进阶之路

【机器学习】通过tensorflow实现猫狗识别的深度学习进阶之路 简介 猫狗识别作为计算机视觉领域的经典入门任务&#xff0c;不仅能帮助我们掌握深度学习的核心流程&#xff0c;更能直观体会到不同优化策略对模型性能的影响。本文将从 “从零搭建简单 CNN” 出发&#xff0c;逐步…

异步处理(前端面试)

Promise 1&#xff1a;使用promise原因 了解回调地狱【什么是回调地狱】 1&#xff1a;回调地狱是异步获取结果后&#xff0c;为下一个异步函数提供参数&#xff0c;层层回调嵌入回调 2&#xff1a;导致回调层次很深&#xff0c;代码维护特别困难 3&#xff1a;在没有ES6时&…

3种XSS攻击简单案例

1、接收cookie端攻击机上用python写个接收web程序flask from flask import Flask, request, Responseapp Flask(__name__)app.route(/) def save_cookie():cookie request.args.get(cookie, )if cookie:with open(/root/cookies.txt, a) as f:f.write(f"{cookie}\n"…

Docker 部署生产环境可用的 MySQL 主从架构

简介跨云服务器一主一从&#xff0c;可以自己按照逻辑配置多个从服务器 假设主服务器ip: 192.168.0.4 从服务器ip&#xff1a;192.168.0.5 系统 CentOS7.9 &#xff08;停止维护了&#xff0c;建议大家用 Ubuntu 之类的&#xff0c;我这个没办法&#xff0c;前人在云服务器上…

DeepResearch(上)

概述 OpenAI首先推出Deep Research Agent&#xff0c;深度研究智能体&#xff0c;简称DRA。 通过自主编排多步骤网络探索、定向检索和高阶综合&#xff0c;可将大量在线信息转换为分析师级别的、引用丰富的报告&#xff0c;将数小时的手动桌面研究压缩为几分钟。 作为新一代…

附050.Kubernetes Karmada Helm部署联邦及使用

文章目录karmada简介karmada概述karmada Helm部署Kubernetes karmada介绍基础准备Kubernetes集群获取chat包正式部署karmada使用karmada纳管集群查看memeber集群导出kubeconfig切换集群测试应用karmada简介 karmada概述 参考&#xff1a;附049.Kubernetes Karmada Local-up部…