1. 程式人生 > 其它 >再也不怕面試官問我 Symbol 是什麼了

再也不怕面試官問我 Symbol 是什麼了

技術標籤:cssjspropertyclassqml

基本資料型別

通常面試官問你,都會問你 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...infor...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);//傳遞異常物件到錯誤處理
}