再也不怕面試官問我 Symbol 是什麼了
阿新 • • 發佈:2021-01-19
基本資料型別
通常面試官問你,都會問你 js 的基本型別都有哪些,你可能會回答:
Number,
String,
Boolean,
Undefined,
Null。
你以為完了,結果面試真的完犢子了,其實還有一個就是在 ES6 中,還新增了一個叫做:
Symbol
什麼意思呢?表示唯一,獨一無二的值,最大的用法是用來定義物件的唯一屬性名。
Symbol 的疑難點
特別需要注意的是:
Symbol 函式棧不能用 new 命令,因為他是基本型別,無法使用 new 操作
vars=newSymbol()//報錯 VM161:1UncaughtTypeError:Symbolisnotaconstructor atnewSymbol(<anonymous>) at<anonymous>:1:9
不能使用 JSON.parse,JSON.stringify 進行深拷貝
varKen=Symbol('kk')
varobj={name:Ken}
varcopy=JSON.parse(JSON.stringify(obj))
console.log(copy)//你會發現name屬性沒了
唯一性質
letKen=Symbol("KK"); console.log(Ken);//Symbol(KK) typeof(Ken);//"symbol" //相同引數Symbol()返回的值不相等 letKen1=Symbol("KK"); Ken===Ken1;//false
作為物件屬性 key 時,在獲取其值的時候,只能使用
[]
形式獲取,不能使用.
操作符
letKen={};
Ken[sy]="kk";
Ken[sy];//"kk"
Ken.sy;//undefined
Symbol 值作為屬性名時,該屬性是公有屬性不是私有屬性,可以在類的外部訪問
但是不會出現在 for...in
、 for...of
的迴圈中,也不會被 Object.keys()
、 Object.getOwnPropertyNames()
返回。如果要讀取到一個物件的 Symbol
屬性,可以通過 Object.getOwnPropertySymbols()
Reflect.ownKeys()
取到。
letKen={};
Ken[sy]="kk";
console.log(Ken);
for(letiinKen){
console.log(i);
}//無輸出
Object.keys(Ken);//[]
Object.getOwnPropertySymbols(Ken);//[Symbol(key1)]
Reflect.ownKeys(Ken);//[Symbol(key1)]
定義常量
在 ES5 使用字串表示常量。例如:
constCOLOR_RED="red";
constCOLOR_YELLOW="yellow";
constCOLOR_BLUE="blue";
但是用字串不能保證常量是獨特的,這樣會引起一些問題:
constCOLOR_RED="red";
constCOLOR_YELLOW="yellow";
constCOLOR_BLUE="blue";
constMY_BLUE="blue";
functionColorException(message){
this.message=message;
this.name="ColorException";
}
functiongetConstantName(color){
switch(color){
caseCOLOR_RED:
return"COLOR_RED";
caseCOLOR_YELLOW:
return"COLOR_YELLOW";
caseCOLOR_BLUE:
return"COLOR_BLUE";
caseMY_BLUE:
return"MY_BLUE";
default:
thrownewColorException("Can'tfindthiscolor");
}
}
try{
varcolor="green";//green引發異常
varcolorName=getConstantName(color);
}catch(e){
varcolorName="unknown";
console.log(e.message,e.name);//傳遞異常物件到錯誤處理
}
但是使用 Symbol 定義常量,這樣就可以保證這一組常量的值都不相等。用 Symbol 來修改上面的例子。
constCOLOR_RED=Symbol("red");
constCOLOR_YELLOW=Symbol("yellow");
constCOLOR_BLUE=Symbol("blue");
functionColorException(message){
this.message=message;
this.name="ColorException";
}
functiongetConstantName(color){
switch(color){
caseCOLOR_RED:
return"COLOR_RED";
caseCOLOR_YELLOW:
return"COLOR_YELLOW";
caseCOLOR_BLUE:
return"COLOR_BLUE";
default:
thrownewColorException("Can'tfindthiscolor");
}
}
try{
varcolor="green";//green引發異常
varcolorName=getConstantName(color);
}catch(e){
varcolorName="unknown";
console.log(e.message,e.name);//傳遞異常物件到錯誤處理
}