ES6 面試題及詳細答案 80題 (33-40)-- Symbol與集合數據結構

前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括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部…