symbol【ES6】

你一閉眼世界就黑了,你不是主角是什么?

目錄

  • 什么是Symbol?
  • ?Symbol特點?:
  • 創建方法:
  • 注意點:
    • 不能進行運算:
    • 顯示調用toString() --沒有意義
    • 隱式轉換boolean
  • 如果屬性名沖突了怎么辦?
    • obj.name和obj[name]的區別:
    • 變量命名:
    • 避免直接寫Symbol()代替變量:
    • 整合變量:
  • 接受傳參:
  • 不能進行for in 循環:
    • Object.getOwnPropertySymbols():
    • Reflect.ownKeys() 遍歷屬性名和屬性值:
  • 作為常量:

什么是Symbol?

ES6引入了一種新的原始數據類型 Symbol表示獨一無二的值,它屬于JavaScript語言的原生數據類型之一。
其他數據類型是: UndefinedNull、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)。

?Symbol特點?:

  • 由于每一個Symbol值都是不相等的,這意味著Symbol值可以作為標識符,用于對象的屬性名,保證不會出現同名的屬性。
  • Symbol主要用于對象屬性的唯一性標識,可以解決屬性名沖突的問題。

創建方法:

let s1 = Symbol(); // 生成了一個symbol類型的數據
console.log(typeof s1); // symbol

每次創建都會生成一個獨一無二的值:

let s1 = Symbol(); // 生成了一個symbol類型的數據
let s2 = Symbol();
console.log(s1 === s2); // false

注意點:

不能進行運算:

Symbol數據類型在JavaScript中是不能進行常規的數學運算的,包括加法(+)、減法(-)、乘法(*)、除法(/)以及比較運算(>、<、>=、<=)等。

let s1 = Symbol();
console.log(s1 + 'aaaa');// es6.html:16 Uncaught TypeError: Cannot convert a Symbol value to a string

在這里插入圖片描述

顯示調用toString() --沒有意義

let s1 = Symbol();
console.log(s1.toString()); // Symbol()
console.log(s1.toString() + 'aaa'); // Symbol()aaa

隱式轉換boolean

let s1 = Symbol();
// 這里的s1相當于true
if (s1) {console.log('執行');
}

在這里插入圖片描述

如果屬性名沖突了怎么辦?

obj.name和obj[name]的區別:

點擊 看 obj.name和obj[name]的區別

let obj = {name: 'sssssy',getName() {console.log(this.name);}
}let name = Symbol();
obj[name] = 'kitty'
console.log(obj);
console.log(obj.name); //sssssy
console.log(obj[name]); // kitty

在這里插入圖片描述

變量命名:

所以寫庫的作者會盡量避免直接.xxx來進行命名:

let name = Symbol();
let age = Symbol();
let obj = {[name]: 'sssssy',[age]: 100
}
console.log(obj);

在這里插入圖片描述

避免直接寫Symbol()代替變量:

避免變量直接寫 Symbol():

let obj = {[Symbol()]: '123', //這樣雖然可以創建一個獨一無二的值,但是訪問不了。
}
console.log(obj[Symbol()]); // undefined 因為這里類似于創建了一個新的Symbol類型。

整合變量:

如果變量過多,也可以這樣來寫:

let keys = {name: Symbol(),age: Symbol(),loacation: Symbol(),test: Symbol(),
}let obj = {[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}
console.log(obj);
console.log(obj[keys.name]); // sssssy
obj[keys.test](); // test

在這里插入圖片描述

接受傳參:

由于展開全是Symbol(),我不知道是哪個變量,所以可以往Symbol()的括號里面添加參數【接受傳參】,讓我們能看出是哪個變量:

let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}
console.log(obj);

在這里插入圖片描述

不能進行for in 循環:

let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {name: '普通屬性',[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}for (let i in obj) {console.log(i);
}

只能打印出普通屬性。。。
在這里插入圖片描述
那該怎么辦呢?
使用Object.getOwnPropertySymbols() 可以拿到所有的Symbol屬性

Object.getOwnPropertySymbols():

let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {name: '普通屬性',[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}console.log(Object.getOwnPropertySymbols(obj));

在這里插入圖片描述
跪求既能拿到普通屬性,又能拿到Symbol屬性的方法!!!
好的。。平身。。。
就是使用:Reflect.ownKeys()

let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {name: '普通屬性',[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}console.log(Reflect.ownKeys(obj));

老鐵們把666打到公屏上!! 66666~6666~6666~
在這里插入圖片描述

Reflect.ownKeys() 遍歷屬性名和屬性值:

包含所有普通屬性的和Symbol屬性的:

let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {name: '普通屬性',[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}Reflect.ownKeys(obj).forEach(item => {console.log(item, obj[item]);
})

在這里插入圖片描述

作為常量:

正常調用:

function play(type) {switch (type) {case 1:console.log('視頻播放');break;case 2:console.log('音頻播放');break;case 3:console.log('圖片播放');break;}
}
play(1) // 視頻播放
play(2) // 音頻播放
play(3) // 圖片播放

1 2 3這樣數字寫的用戶不理解,我們把它們換成可理解的:
但是這樣如果我提前知道這些數字,依舊可以通過數字去調用到

const VIDEO = 1;
const AUDIO = 2;
const IMAGE = 3;
function play(type) {switch (type) {case VIDEO:console.log('視頻播放');break;case AUDIO:console.log('音頻播放');break;case IMAGE:console.log('圖片播放');break;}
}
play(VIDEO) // 視頻播放
play(1) // 視頻播放

這時候就可以使用Symbol作為一個常量:(也就是作為一種應用,統一代碼的一致性)

const VIDEO = Symbol();
const AUDIO = Symbol();
const IMAGE = Symbol();
function play(type) {switch (type) {case VIDEO:console.log('視頻播放');break;case AUDIO:console.log('音頻播放');break;case IMAGE:console.log('圖片播放');break;}
}
play(VIDEO) // 視頻播放
play(1) // 什么都沒有

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82434.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82434.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82434.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 649. Dota2 參議院 java題解

https://leetcode.cn/problems/dota2-senate/description/ 貪心。不會寫。 class Solution {public String predictPartyVictory(String senate) {boolean rtrue,dtrue;int flag0;//flag>0,d前面有r;flag<0,r前面有dchar[] senatessenate.toCharArray();//每一輪while(r…

機器學習第二十二講:感知機 → 模仿大腦神經元的開關系統

機器學習第二十二講&#xff1a;感知機 → 模仿大腦神經元的開關系統 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&#xff1a;超詳細手把手指南 感知機詳解…

maven快速上手

之前我們項目如果要用到其他額外的jar包&#xff0c;需要自己去官網下載并且導入。但是有maven后&#xff0c;直接在maven的pom.xml文件里用代碼配置即可&#xff0c;配置好后maven會自動幫我們聯網下載并且會自動導入該jar包 在右邊的maven中&#xff0c;我們可以看到下載安裝…

科學養生指南:解鎖健康生活密碼

健康是人生最寶貴的財富&#xff0c;在快節奏的現代生活中&#xff0c;科學養生成為保持良好狀態的關鍵。遵循現代醫學與營養學的研究成果&#xff0c;無需依賴傳統中醫理論&#xff0c;我們也能找到適合自己的養生之道。? 均衡飲食是健康的基石。現代營養學強調 “食物多樣&…

Qt狀態機QStateMachine

QStateMachine QState 提供了一種強大且靈活的方式來表示狀態機中的狀態&#xff0c;通過與狀態機類(QStateMachine)和轉換類(QSignalTransition&#xff0c; QEventTransition)結合&#xff0c;可以實現復雜的狀態邏輯和用戶交互。合理使用嵌套狀態機、信號轉換、動作與動畫、…

C++八股 —— 原子操作

文章目錄 1. 什么是原子操作2. 原子操作的特點3. 原子操作的底層原理4. 內存序內存屏障 5. 原子操作和互斥鎖的對比6. 常用的原子操作7. 相關問題討論 參考&#xff1a; C atomic 原子操作_c 原子操作-CSDN博客DeepSeek 1. 什么是原子操作 原子操作&#xff08;Atomic Opera…

雙紫擒龍紫紫紅指標源碼學習,2025升級版紫紫紅指標公式-重點技術

VAR1:MA((LOWHIGHCLOSE)/3,5); VAR2:CLOSEHHV(C,4) AND REF(C,1)LLV(C,4); 雙紫擒龍:REF(C,1)LLV(C,4) AND C>REF(C,2) OR REF(C,2)LLV(C,4) AND REF(C,1)<REF(C,3) AND REF(C,2)<REF(C,4) AND C>REF(C,1); VAR4:VAR1>REF(VAR1,1) AND REF(VAR1,1)<REF(VAR1,…

NeuralRecon技術詳解:從單目視頻中實現三維重建

引言 三維重建是計算機視覺領域中的一項關鍵技術&#xff0c;它能夠從二維圖像中恢復出三維形狀和結構。隨著深度學習的發展&#xff0c;基于學習的方法已經成為三維重建的主流。NeuralRecon是一種先進的三維重建方法&#xff0c;它能夠從單目視頻中實時生成高質量的三維模型。…

Ubuntu 上開啟 SSH 服務、禁用密碼登錄并僅允許密鑰認證

1. 安裝 OpenSSH 服務 如果尚未安裝 SSH 服務&#xff0c;運行以下命令&#xff1a; sudo apt update sudo apt install openssh-server2. 啟動 SSH 服務并設置開機自啟 sudo systemctl start ssh sudo systemctl enable ssh3. 生成 SSH 密鑰對&#xff08;本地機器&#xf…

MySQL 索引的增刪改查

MySQL 索引的增刪改查 1 建表時創建索引 [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [別名] (字段名 [(長度)] [ASC|DESC] )主鍵直接寫&#xff1a; PRIMARY KEY (Id)例如&#xff1a; CREATE TABLE people (id int NOT NULL PRIMARY KEY AUTO_INCREMENT,last_name varchar(10)…

為什么現代CSS應該選擇OKLCH:從顏色科學到設計系統革新

在數字界面中&#xff0c;顏色不僅是美學的載體&#xff0c;更是信息傳遞的重要工具。CSS Color Level 4 標準引入了 OKLCH 顏色空間, 提供??感知均勻性??&#xff08;顏色差異與實際視覺感受一致&#xff09;&#xff0c;解決傳統HSL/HSV在調整顏色時的不自然問題。文本幫…

【java】小練習--零錢通

文章目錄 前言一、項目開發流程說明二、功能實現2.1 菜單2.2 零錢通明細2.3 零錢通收益2.4 零錢通消費2.5 零錢通退出確認2.6 零錢通金額校驗2.7 完整代碼 三、零錢通OOP版 前言 本文是我跟著B站韓順平老師的 Java 教程學習時動手實現“零錢通”項目的學習筆記&#xff0c;主要…

人工智能數學基礎實驗(四):最大似然估計的-AI 模型訓練與參數優化

一、實驗目的 理解最大似然估計&#xff08;MLE&#xff09;原理&#xff1a;掌握通過最大化數據出現概率估計模型參數的核心思想。實現 MLE 與 AI 模型結合&#xff1a;使用 MLE 手動估計樸素貝葉斯模型參數&#xff0c;并與 Scikit-learn 內置模型對比&#xff0c;深入理解參…

我的第1個爬蟲程序——豆瓣Top250爬蟲的詳細步驟指南

我的第1個爬蟲程序——豆瓣Top250爬蟲的詳細步驟指南 一、創建隔離開發環境 1. 使用虛擬環境&#xff08;推薦venv&#xff09; # 在項目目錄打開終端執行 python -m venv douban_env # 創建虛擬環境 source douban_env/bin/activate # Linux/macOS激活 douban_env\Scri…

STM32八股【11】-----Linux Bootloader (U-Boot)

參考U-Boot U-Boot是什么 嵌入式Linux系統需要一個bootloader來加載系統 U-boot就是一個通用開源的嵌入式Linux bootloader 主要實現的功能&#xff1a; 初始化硬件資源&#xff08;如內存、串口、存儲器等&#xff09;從存儲介質加載Linux內核到內存中傳遞啟動參數給內核啟…

【設計模式】責任鏈+模板+工程模式使用模板

前言 方便寫出優雅&#xff0c;解耦&#xff0c;高內聚&#xff0c;高復用的代碼。 Demo // 1. 定義驗證器接口&#xff08;責任鏈模式&#xff09; public interface Validator {Validator setNext(Validator next);boolean validate(Data data); }// 2. 創建抽象驗證器&am…

Unity3D仿星露谷物語開發49之創建云杉樹

1、目標 創建一顆既可以生長又可以砍伐的云杉樹&#xff0c;這個和之前創建橡樹類似。 2、創建云杉樹預制體 創建新物體命名為CropTreeBlueSpruce&#xff0c;并且添加Box Collider 2D和Crop組件。 在CropTreeBlueSpruce下創建子物體命名為CropSprite&#xff0c;添加3個組件…

【C#】消息隊列的使用

在C#中使用消息隊列&#xff0c;通常是指使用微軟的Message Queuing (MSMQ)技術。MSMQ提供了一種異步通信協議&#xff0c;允許應用程序通過暫時存儲要發送到目的地的消息來相互通信。 安裝MSMQ 首先&#xff0c;確保你的開發機器和部署服務器上都安裝了MSMQ。可以通過“控制…

IP-guard發布新版本4.87.2241.0

IP-guard發布新版本4.87.2241.0 新版本下載地址: https://www.tec-development.com/down/IPguard/Release/V4/IPguard4.87.2241.0.zip?s=901D45ADB22CBBFE5C612DC40AFD6BFB1551A9CD54EF418D5E86BBD256813867 新版本升級地址:

【Linux 服務器磁盤映像備份與恢復實戰指南】虛擬機備份,物理機上云都可以用這套方案!

Linux 服務器磁盤映像備份與恢復實戰指南 背景 在服務器運維中&#xff0c;磁盤健康度下降可能導致數據丟失風險&#xff0c;特別是在未配置 RAID 的情況下。針對這種情況&#xff0c;備份磁盤數據并恢復到新設備是確保數據安全的關鍵。本文記錄了使用 dd 命令通過 NFS 實現全…