ES6新增基本資料型別Symbol

2021-10-20 18:09:36 字數 2809 閱讀 6901

es6 引入了一種新的原始資料型別 symbol,表示獨一無二的值,最大的用法是用來定義物件的唯一屬性名。es6 資料型別除了number 、 string 、 boolean 、 objec t、 null 和 undefined,還新增了 symbol 。

由於每乙個 symbol 的值都是不相等的,所以 symbol 作為物件的屬性名,可以保證屬性不重名。

let sy = symbol("key1");

// 寫法1

let syobject = {};

syobject[sy] = "kk";

console.log(syobject); //

// 寫法2

let syobject = ;

console.log(syobject); //

// 寫法3

let syobject = {};

object.defineproperty(syobject, sy, );

console.log(syobject); //

symbol 作為物件屬性名時不能用.運算子,要用方括號。因為**.運算子後面是字串**,所以取到的是字串 sy 屬性,而不是 symbol 值 sy 屬性。

let syobject = {};

syobject[sy] = "kk";

syobject[sy]; // "kk"

syobject.sy; // undefined

symbol 值作為屬性名時,該屬性是公有屬性不是私有屬性,可以在類的外部訪問。但是不會出現在 for…in 、 for…of的迴圈中,也不會被 object.keys() 、 object.getownpropertynames() 返回。如果要讀取到乙個物件的 symbol 屬性,可以通過 object.getownpropertysymbols() 和 reflect.ownkeys() 取到

let syobject = {};

syobject[sy] = "kk";

console.log(syobject); //

for (let i in syobject) // 無輸出

object.keys(syobject); //

object.getownpropertysymbols(syobject); // [symbol(key1)]

reflect.ownkeys(syobject); // [symbol(key1)]

在 es5 使用字串表示常量。例如:

const color_red = "red";

const color_yellow = "yellow";

const color_blue = "blue";

但是用字串不能保證常量是獨特的,這樣會引起一些問題:

const color_red = "red";

const color_yellow = "yellow";

const color_blue = "blue";

const my_blue = "blue";

function colorexception(message)

function getconstantname(color) }

try catch (e)

但是使用 symbol 定義常量,這樣就可以保證這一組常量的值都不相等。用 symbol 來修改上面的例子。

const color_red = symbol("red");

const color_yellow = symbol("yellow");

const color_blue = symbol("blue");

function colorexception(message)

function getconstantname(color) }

try catch (e)

symbol 的值是唯一的,所以不會出現相同值的常量,即可以保證 switch 按照**預想的方式執行。

symbol.for() 類似單例模式,首先會在全域性搜尋被登記的 symbol 中是否有該字串引數作為名稱的 symbol 值,如果有即返回該 symbol 值,若沒有則新建並返回乙個以該字串引數為名稱的 symbol 值,並登記在全域性環境中供搜尋。

let yellow = symbol("yellow");

let yellow1 = symbol.for("yellow");

yellow === yellow1; // false

let yellow2 = symbol.for("yellow");

yellow1 === yellow2; // true

symbol.keyfor() 返回乙個已登記的 symbol 型別值的 key ,用來檢測該字串引數作為名稱的 symbol 值是否已被登記。

let yellow1 = symbol.for("yellow");

symbol.keyfor(yellow1); // "yellow"

ES6 新增Symbol資料型別

1 symbol 是原始資料型別,不是物件。不能用 new 命令。可以接受乙個字串作為引數,為新建立的 symbol 提供描述。let sy symbol kk console.log sy symbol kk typeof sy symbol 注意相同引數 symbol 返回的值不相等 let s...

ES6新增資料型別

1.新增資料型別 symbol 2.proxy 用來攔截在乙個物件上的指定操作,如 var engineer var interceptor engineer new proxy engineer,interceptor engineer.salary 60 salary is changed to...

es6 新增的資料型別 symbol

應用場景 es5的物件屬性名都是字串,容易造成屬性名衝突 es6引入新的原始資料型別symbol,表示獨一無二的值 物件屬性名可以有兩種型別 1.字串 2.symbol型別 獨一無二,不會與其他屬性名產生衝突 描述 物件屬性名的問題 只會顯示lucy的名字 obj.name bob obj.name...