ES6新增資料型別Symbol
Symbol的含義?
ES6(2015) 引入了第七種原始資料型別Symbol
,Symbol
英文文意思為 符號、象徵、標記、記號,在 js 中更確切的翻譯應該為獨一無二的
Symbol的使用?
Symbol 值通過Symbol函式生成,這裡需要注意Symbol
函式前不能使用new
命令,切記,切記,切記
let sym = Symbol()
1、接受一個字串型別的引數
let a = Symbol("name")
a // Symbol(name)
a.toString() // "Symbol(name)"
2、有無引數做對比
①有引數
let a1 = Symbol("name")
let a2 = Symbol("name")
a1 === a2 //false
可以看出a1,a2是Symbol的返回值並且引數相同但它們是不相等的。
②無引數
let a1 = Symbol()
let a2 = Symbol()
a1 === a2 //false
可以看出a1,a2是Symbol的返回值,但它們是不相等的。
3、不能與其他的資料型別進行運算
let s = Symbol("Hi Symbol")
s + "welcome your visit"
此時瀏覽器會報錯T
ypeError: can't convert symbol to string
意思是將Symbol 值不能與其他型別的值進行運算
4.顯式轉為字串
let s = Symbol("Hello word")
第一種 String(s) //'Symbol("Hello word")'
第二種s.toString()//'Symbol("Hello word")'
5.轉布林型別
let s = Symbol()
Boolean(s) // true
!s //false
6.Symbol.prototype.description
此語法是為剛建立好的Symbol語法新增一個描述。
const s = Symbol("Hello Word")
讀取描述:s.description // "Hello Word"
7.可以當屬性名來使用(它的獨一無二性質,可以防止鍵名被改寫或覆蓋)
let s = Symbol()
//第一種方式
let obj = {}
obj[s] = 'Hello Word';
//第二種方式
let obj = {
[s]:'Hello Word'
}
//第三種方式
let obj = {}
Object.defineProperty(obj,s,{value:"Hello Word"})
obj[s] // "Hello Word"
8.Symbol.for()Symbol.keyFor()
let a1 =Symbol.for("name")
let a2 =Symbol.for("name")
a1 === a2 //true
兩個相等的原因是Symbol.for()
不會每次呼叫就返回一個新的 Symbol 型別的值,是會先檢查給定的key
是否已經存在,如果不存在才會新建一個值。
Symbol.keyFor()
方法返回一個已登記的 Symbol 型別值的key
。
let a1 = Symbol.for("name");
Symbol.keyFor(s1) // "name"
let a2 = Symbol("name");
Symbol.keyFor(s2) // undefined