js中除了undefined number function string object null Boolean,es6新加了一種類型Symbol
{
let s1=Symbol();
let s2=Symbol();
console.log(s1);//Symbol()
console.log(s2);//Symbol()
console.log(typeof s1);//Symbol
console.log(s1==s2);//false
}
description 標識屬性,返回symbol的描述
console.log(Symbol('message').description);//message
很明顯,symbol都是不相等,這是最關鍵的特性
然后繼續往下看,要是symbol傳個參數呢
{
//傳字符串
let s1=Symbol('string');
let s2=Symbol('string');
console.log(s1);//Symbol(string)
console.log(s2);//Symbol(string)
console.log(s1==s2);//false
//傳數組
const s3=Symbol([1,2,3]);
const s4=Symbol([1,2,3]);
console.log(s3);//Symbol(1,2,3)
console.log(s4);//Symbol(1,2,3)
console.log(s3==s4);//false
//傳對象
const json={a:1};
const s5=Symbol(json);
const s6=Symbol(json);
console.log(s5);//Symbol([object Object])
console.log(s6);//Symbol([object Object])
console.log(s5==s6);//false
}
以上例子可以看出,Symbol函數的參數只是表示對當前 Symbol 值的描述,因此相同參數的Symbol函數的返回值是不相等的。
如果想把symbol轉化成其他類型,改擺什么姿勢才行呢,繼續往下看
{
//Symbol 值可以顯式轉為字符串。
const s=Symbol('string');
//console.log('hello'+s);//Cannot convert a Symbol value to a string
console.log('hello'+String(s));//helloSymbol(string)
console.log('hello'+s.toString(s));//helloSymbol(string)
//Symbol 值也可以轉為布爾值,但是不能轉為數值。
console.log(Boolean(s));//true
const b=Symbol(1);
//Number(b);// Cannot convert a Symbol value to a number
}
json對象中使用symbol作為屬性,幾個注意點
{
let s=Symbol();
let obj={
[s]:'symbol',
s:'hello'
}
console.log(obj[s]);//symbol
console.log(obj.s);//hello
//Symbol 值作為對象屬性名時,不能用點運算符。用中括號
}
屬性名的遍歷
{
let s=Symbol();
let b=Symbol();
let obj={
[s]:'symbol',
s:'hello',
[b]:'world'
}
for (let name in obj){
console.log(name);//s
}
for (let val of Object.values(obj)){
console.log(val);//hello
}
//Symbol 作為屬性名,該屬性不會出現在for...in、for...of循環中
//下面這個方法循環出屬性名是symbol類型的屬性值
let arr=Object.getOwnPropertySymbols(obj);
console.log(arr);//[Symbol(), Symbol()]
for (let i of Object.values(arr)){
console.log(obj[i]);//symbol world
}
//如果都想循環出來的話,Reflect.ownKeys方法可以返回所有類型的鍵名
let arrs=Reflect.ownKeys(obj);
for (let name of Object.values(arrs)){
console.log(obj[name]);//hello symbol world
}
}
看一下Symbol.for(),Symbol()的區別
{
console.log(Symbol()===Symbol());//false
console.log(Symbol.for()===Symbol.for());//true
}
Symbol.for()與Symbol()這兩種寫法,都會生成新的Symbol。它們的區別是,前者會被登記在全局環境中供搜索,后者不會。Symbol.for()不會每次調用就返回一個新的 Symbol 類型的值,而是會先檢查給定的key是否已經存在,如果不存在才會新建一個值。比如,如果你調用Symbol.for("cat")30次,每次都會返回同一個 Symbol 值,但是調用Symbol("cat")30次,會返回30個不同的Symbol值
Symbol.keyFor的用法
{
let s1=Symbol('s1');
let s2=Symbol.for('s2');
console.log(Symbol.keyFor(s1));//undefined
console.log(Symbol.keyFor(s2));//s2
}
Symbol.keyFor方法返回一個已登記的 Symbol 類型值的key,這個方法針對Symbol.for()是ok的,但是對Symbol()是掛掉的,返回的是個undefined
ok,按照國際慣例,咱們得來這么一下子
Symbol的幾個特性的介紹這么多,想看更詳細的資料,請狠狠的點擊我