ES6筆記(4)-- Symbol類型

?

  系列文章 -- ES6筆記系列

?

Symbol是什么?中文意思是標志、記號,顧名思義,它可以用了做記號。

是的,它是一種標記的方法,被ES6引入作為一種新的數據類型,表示獨一無二的值。

由此,JS的數據類型多了一位成員:

Number、String、Boolean、undefined、Object、Symbol

?

一、簡單使用

1. 聲明

類似字符串String的聲明方式 var str = 'str'; Symbol的聲明方式類似,它調用構造函數Symbol()

var s = Symbol();
typeof s // symbol

2. 使用

Symbol聲明了是為了使用

var s = Symbol();
var s1 = Symbol();console.log(s, s1);
console.log(s == s1); // false

Chrome的輸出中自動對Symbol類型的數據做了標識處理,由輸出知道,雖然通過Symbol生成的兩個標志不相同,但兩個變量混淆了分不清。

實際上,為了區別出不同的symbol,我們可以在參數中指定

var s = Symbol('s');
var s1 = Symbol('s1');console.log(s, s1);

symbol除了簡單的在控制臺輸出之外,還可以參與到其他代碼邏輯運算中去,最常見的是在對象屬性名稱中(為確保屬性名惟一而存在)

var s = Symbol();
var s1 = Symbol('s1');var obj = {[s]: function() {console.log(1);},[Symbol()]: () => {console.log(2);},[s1]: 3
};obj[s]() // 1
obj[s1] // 3

注意到symbol要使用[]中括號包裹起來,調用的時候也一樣(不能使用obj.s的方式,這樣會被識別成字符串)

3. 屬性的遍歷

如上代碼,如果我們想遍歷對象的屬性值,也許會這樣操作

for (var item in obj) {if (typeof obj[item] === 'function') {obj[item]();} else {console.log(obj[item]);}
}Object.keys(obj).forEach(function(item) {if (typeof obj[item] === 'function') {obj[item]();} else {console.log(obj[item]);}
});

卻發現什么也沒輸出

因為要獲取到Symbol這個屬性名,ES6引入了新的方法,舊的for...in ?Object.keys()、Object.getOwnPropertyNames()等不支持訪問

使用新的getOwnPropertySymbols方法

var s = Symbol();
var s1 = Symbol('s1');var obj = {[s]: function() {console.log(1);},[Symbol()]: () => {console.log(2);},[s1]: 3,a: 4
};Object.getOwnPropertySymbols(obj).forEach(function(item) {if (typeof obj[item] === 'function') {obj[item]();} else {console.log(obj[item]);}
});// 輸出 1 2 3

雖然識別了symbol類屬性,但常規屬性卻被忽略了,所以ES6還引入了一個新的內置類Reflect,它的ownKeys方法可以識別出所有屬性名

var s = Symbol();
var s1 = Symbol('s1');var obj = {[s]: function() {console.log(1);},[Symbol()]: () => {console.log(2);},[s1]: 3,a: 4
};Reflect.ownKeys(obj).forEach(function(item) {if (typeof obj[item] === 'function') {obj[item]();} else {console.log(obj[item]);}
});// 輸出 4 1 2 3

?

4. 類型轉換

數字轉換成字符串我們可以簡單的使用 + '' 實現,symbol呢

var s = Symbol();
var s1 = Symbol('s1');s + '' // Uncaught TypeError: Cannot convert a Symbol value to a string

出錯了,提示不能轉換。

實際上,我們只是不能直接轉換值,還是可以用toString或String方法轉換這個標志的

var s = Symbol();
var s1 = Symbol('s1');s.toString() // Symbol()
String(s1) // Symbol(s1)

類似的,也可以轉換為bool值

var s = Symbol();
var s1 = Symbol('s1');!!s // true
!s // false
Boolean(s1) // true

不過,symbol是不能轉換成數值Number類型的

5. Symbol.for()相同值的使用

有時候我們需要使用同一個symbol值,而調用Symbol()的時候會自動創建不同的值

var temp = [];var scores = [{name: 'jack',score: 10
}, {name: 'pick',score: 20
}, {name: 'pick',score: 30
}];scores.forEach(function(item) {temp.push({name: Symbol(item.name),score: item.score});
});temp[1].name == temp[2].name // false

以上代碼主要為了登記不同用戶的分數,并確保唯一性使用了symbol,但最終用戶名都為pick的項不想等,可能會導致后續的計算出錯

把Symbol換成Symbol.for,輸出才為true

兩者類似,都可以生成一個Symbol類型的值,但后者是先判斷全局中是否有該symbol值,有就返回該值,沒有才創建,并將該值登記在全局中

var s = Symbol.for('s');
var s1 = Symbol.for('s');s == s1 // true
s === s1 // truevar s = Symbol('s');
var s1 = Symbol('s');s == s1 // false
s === s1 // false

此外,我們可以用Symbol.keyFor()訪問全局中的symbol相關項,沒有則返回undefined

var s = Symbol.for('s');
var s1 = Symbol.for('s');Symbol.keyFor(s) // s
Symbol.keyFor(s1) // s
Symbol.keyFor(s2) // Uncaught ReferenceError: s2 is not definedvar s3 = Symbol('s3');
Symbol.keyFor(s3) // undefined

?

6. Symbol的更多使用

Symbol的更多使用方法,可參考 MDN - Symbol

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

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

相關文章

mysql類型說明_MYSQL 數據類型說明

MySQL支持大量的列類型,它可以被分為3類:數字類型、日期和時間類型以及字符串(字符)類型。本節首先給出可用類型的一個概述,并且總結每個列類型的存儲需求,然后提供每個類中的類型性質的更詳細的描述。概述有意簡化,更…

LeetCode OJ - Convert Sorted List to Binary Search Tree

題目: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 解題思路: 注意是讓構造平衡二叉搜索樹。 每次將鏈表從中間斷開,分成左右兩部分。左邊部分用來構造左子樹&#xff…

手把手教你如下在Linux下如何寫一個C語言代碼,編譯并運行

文章目錄手把手教你如下在Linux下如何寫一個C語言代碼,編譯并運行打開Ubuntu終端創建 helloworld.c編譯C文件手把手教你如下在Linux下如何寫一個C語言代碼,編譯并運行 打開Ubuntu終端 我這里的終端是Windows下的WSL,如果有疑問,…

郵件群發工具的編寫(二)數據的保存

數據的保存與讀取 人類是在不斷探索與改進中進步的 上一篇,郵件群發工具的編寫(一)郵件地址提取,我們講到了郵箱的提取。 那么這一篇,講一下提取完的郵箱信息的保存和讀取。 首先,我希望對上一篇郵箱提取類…

mysql 文件描述符_MySQL沒有發布臨時文件描述符

幾天前,我們遇到了MySQL安裝的一些嚴重問題:MySQL不斷打開臨時文件(正常行為)但這些文件從未發布過.結果是,最終磁盤空間耗盡,我們必須重新啟動服務并手動清理/ tmp.使用lsof,我們看到這樣的事情:mysqld 16866 mysql 5u REG 8,3 0 692 /tmp/ibyWJylQ (de…

c++ lambda函數_C++11 之 lambda函數的詳細使用

1. lambda 函數概述lambda 表達式是一種匿名函數,即沒有函數名的函數;該匿名函數是由數學中的λ演算而來的。通常情況下,lambda函數的語法定義為:[capture] (parameters) mutable ->return-type {statement}其中:[c…

zabbix監控 openstack 的實例的資源使用情況

領導提出的需求:在不給云主機安裝客戶端的情況下,監控云主機的 cpui 內存 網絡 io,并且能出圖。想了幾個方案:1、ceilometer取數據,存入mangodb,用zabbix來讀mangodb數據繪圖2 ceilometer 取數據 &#xff…

pytorch 正向與反向傳播的過程 獲取模型的梯度(gradient),并繪制梯度的直方圖

記錄一下怎樣pytorch框架下怎樣獲得模型的梯度 文章目錄引入所需要的庫一個簡單的函數模型梯度獲取先定義一個model如下定義兩個獲取梯度的函數定義一些過程與調用上述函數的方法可視化一下梯度的histogram引入所需要的庫 import os import torch import torch.nn as nn impor…

2012-9

響應式設計的典范 http://www.bostonglobe.com/ 網站測試頁面 http://www.webpagetest.org/ 編程算法 http://blog.sina.com.cn/s/articlelist_1647038822_1_1.html C Programmers Cookbook http://www.cppblog.com/mzty/category/7609.html Blade 是一個現代構建系統&#xff…

PV操作 (轉載)

PV操作與信號量的處理相關,P表示通過的意思,V表示釋放的意思。信號量是最早出現的用來解決進程同步與互斥問題的機制,包括一個稱為信號量的變量及對它進行的兩個原語操作。 信號量(semaphore)的數據結構為一個值和一個…

ubuntu升級python_Ubuntu 升級python3為更高版本【已實測】

2020-04-13 更新安裝步驟: 1. 先update一下 sudo apt update 2. 安裝依賴庫 sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-d…

mysql5.0 java連接_Java連接mysql5.0

網上的資料真爛,千篇一律的拷貝的,根本不能用,鄙視! 正題: 到MYSQL網站下載mysql-connector-java-5.0.4.zip文件,解壓; 解壓后有一個文件:mysql-connector-java-5.0.4-bin.jar 把這個…

Framework打包

2019獨角獸企業重金招聘Python工程師標準>>> iOS app需要在許多不同的CPU架構下運行: arm7: 在最老的支持iOS7的設備上使用 arm7s: 在iPhone5和5C上使用 arm64: 運行于iPhone5S的64位 ARM 處理器 上 i386: 32位模擬器上使用 x86_64: 64為模擬器上使用…

windows 10 下利用WSL的Linux環境實現vscode C/C++環境的配置

本文主要結合二個工具,介紹如何在windows搭建Linux開發環境: WSL(Windows Subsystem for Linux)VSCode(Visual Studio Code) 文章目錄WSL安裝VSCode安裝配置Linux下的C/C環境1. 打開WSL的控制臺2. 更新ubuntu軟件3. 安裝GCC和GDB4. 配置VSCode(1). 打開…

java類初始化順序

轉自:http://zangweiren.iteye.com/blog/208122 對于靜態變量、靜態初始化塊、變量、初始化塊、構造器,它們的初始化順序以此是(靜態變量、靜態初始化塊)>(變量、初始化塊)>構造器。我們也可以通過下…

Java 8 - Interface Default Method接口默認方法

Java 8 相比于Java 7 推出了幾大特色(features)(接口默認方法)default methods in interface, (接口靜態方法)static method in interface, 函數編程(functional programming), lamda expression, stream API.這里首先…

Windows 11下 WSL使用 jupyter notebook

這里寫目錄標題前言在WSL下的配置測試運行更優雅的啟動方法配置jupyter生成默認配置文件生成秘鑰修改配置文件nohup啟動前言 一直都使用jupyter notebook,不管做數據分析,還是調試代碼,還有寫文章都是。但是好像在WSL下又不好使。看了網上有…

sql2000導出mysql_如何將sql2000的數據庫導入到mysql中?

展開全部先用SQl2000導出e68a843231313335323631343130323136353331333262373366文本文件,把后綴名改為CSv,再從Mysql中一導入OK參考:第一種是安裝mysql ODBC,利用sql server的導出功能,選擇mysql數據源,進…

實現日、周、月排行統計 sql

在如今很多系統中,都需要進行日、周、月排行統計,但是在網上尋找 了一番,發現很多都是相對的周、月排行,即周排行則用當前時間減去7天。這樣我個人認為并不恰當。如月排行中,假設今天是4月22日,則從3月22日至4月22日之…

產品運行所需的信息檢索失敗_為服務業注入新活力,華北工控推出服務機器人專用計算機產品方案...

近年來,隨著人口老齡化趨勢加快和信息科技革命的持續推進,服務機器人已經被當作社會勞動力的一部分在醫療、教育、餐飲等行業廣泛應用,市場潛力巨大。01、需求帶動消費,科技改變服務服務機器人是國內智能機器人產業發展最快的分支…