1. 程式人生 > >ES6---新增資料型別Symbol

ES6---新增資料型別Symbol

es6新標,加入了新的資料型別Symbol與新的資料結構set、map,他們各有特點。

●Symbol:
let a=Symbol();
console.log(typeof a);//symbol,js語言的資料型別再添一員


Symbol()==Symbol();//false
let a=Symbol();
let b=Symbol();
a==b;//false,symbol資料的特性,每個symbol資料都是獨一無二的值,在物件增加屬性的時候,可以避免名字重複的困擾


let a=Symbol();
let b=Symbol();
console.log(a);//Symbol()
console.log(b);//Symbol(),a與b雖然不相等,但是打印出的資料卻是一樣的,為了區分他們,可以傳參:
let c=Symbol('ccc');//Symbol(ccc),傳入的引數僅做標記,沒有任何實際意義


let a=Symbol();
a+'ccc';//報錯
a+2;//報錯,symbol型別的資料不能與其他型別的資料進行運算


let a=Symbol('aaa');
String(a);//'Symbol(aaa)'
Boolean(a);//true
Number(a);//報錯,symbol型別的資料可以轉為string與boolean型別,但是不能轉換為number型別


let a=Symbol();
let obj1={a:'aaa'};//結果{a:'aaa'},此時的obj的屬性是a
let obj2={[a]:'aaa'};//{Symbol(): "aaa"},此時obj的屬性則是Symbol();
console.log(obj2[a]);//aaa,取值時候,屬性名依然是a

新的資料型別symbol,最大的特點首當唯一性了,symbol不能隱式的轉換型別,所以和其他數型別資料做運算時會報錯。但是,symbol可以顯式地轉為字串和布林型別。物件object,在新增symbol型別屬性時,必須用[]外擴symbol,不能用點式法對其進行操作。如同其他型別資料一般,symbol也有一些內建方法,,,
let a=Symbol.for('my');
let b=Symbol.for('my');
a==b;//true,到此處,看似已經與上面相抵觸,其實不然Symbol(my)僅產生了一個symbol資料,a和b都是同一個值,下面可看例子:

let ab=Symbol();
let a=ab;
let b=ab;
a==b;//true,這裡便是上例子的解釋


let a=Symbol('my');
let b=Symbol.for('my');
Symbol.keyfor(a);//undefined
Symbol.keyfor(b);//my
///Symbol.keyfor()方法接收一個Symbol.for()產生的資料,返回其對應描述(標記),由於a直接由Symbol()產生,故未能識別

let arr1=[1,2,3];
let arr2=['a','b'];
arr1[Symbol.isConcatSpreadable]=false;
arr1.concat(arr2);//[[1,2,3],a,b]
arr1[Symbol.isConcatSpreadable]=true;
arr1.concat(arr2);//[1,2,3,a,b]
////[Symbol.isConcatSpreadable]表示concat進行拼接時候,是否展開,預設true。

symbol借鑑了很多其他資料型別的方法,包括替換、分割、遍歷等等…

原文:https://blog.csdn.net/Wbiokr/article/details/68124721