ES6新資料型別 Symbol

2021-08-02 19:30:00 字數 3591 閱讀 4339

我們都知道es5 為我們提供了六種資料型別。分別是: 物件(object)、數字型別(number) 、布林型別(boolean)、字串型別(string)、空型別(null)、未定義型別(undefind)

e6又為我們增加了一種型別 symbol 型別,他表示獨一無二的值。這樣下來js 就有七種資料型別了。

一、symbol 用法

1.symbol 的用法很簡單:

let a = symbol();       

console.log(a);// symbol()

console.log(typeof a)// 它的型別就是 symbol

// 我們也可以為symbol 型別加一些引數(做一些標記號) 用來區分

let b = symbol("b")

console.log(b) // symbol(b)

因為symbol型別 表示的是獨一無二的值,所以

即便變數都是symbol型別,那麼也不相等。

var a = symbol();

var b = symbol();

console.

log(a == b) // fales

2.symbol資料注意點

① symbol 資料型別不能夠轉換為數值型別,否則會報錯

② symbol 資料型別不能用new 操作符去宣告,因為它本身是乙個原始值,而不是物件

③ symbol 資料型別不能夠和字串進行拼接,否則會報錯

④ symbol 資料型別可以轉化為布林型別

二、symbol 的用途

es6 新增乙個這個資料型別有什麼用處呢。首先我們它解決了我們在定義乙個物件時,不小心把鍵改寫或覆蓋的問題。

1.作為屬性名

var obj = 

console.

log(obj.name) // king

上邊 由於name 又一次出行將之前的name 值給覆蓋了,你可能認為這種錯誤基本不能出現,但是如果但你處理的資料比較多時,這種錯誤出現的概率還是很大的。

我們這樣寫:

var username = symbol();

var obj =

console.log(obj[username]) // hello

上邊需要注意的是:

①usename 定義為symbol 型別後,如果在出現 username 的鍵 將會報錯。

② 因為username 是變數,變數作為屬性要用中括號,如果使用.缺省會將屬性變為字串。

重點內容給物件填屬相我們還可以用defineproperty()

var obj={};

object.defineproperty(obj,username,);

2.消除魔術變數

魔術字串指的是,在**之中多次出現、與**形成強耦合的某乙個具體的字串或者數值。風格良好的**,我們應該盡量消除魔術字串。(這裡我引用的是阮一峰的例子)

function getarea(shape, options) 

return area;

}getarea('********', ); // 魔術字串

上面的**,字串******** 就是乙個魔術字串,它多次出現,與**形成「強耦合」,不利於將來的修改和維護。

常用的消除魔術字串的方法,就是把它寫成乙個變數:

var shapetype = ;

function

getarea

(shape, options)

return area;

}getarea(shapetype.********, );

上面**中,我們把********寫成shapetype物件的********屬性,這樣就消除了強耦合。

如果仔細分析,可以發現shapetype.********等於哪個值並不重要,只要確保不會跟其他shapetype屬性的值衝突即可。因此,這裡就很適合改用 symbol 值。

const shapetype =;
上面**中,除了將shapetype.********的值設為乙個symbol,其他地方都不用修改。

三、symbol 的一些方法

1.當symbol 作為屬性名時,改屬性不會被for....infor...of遍歷, 也不會被object.keys()object.getownpropertynmaes()json.stringify()返回

但是它也不是乙個私有屬性,它有以下方法:

object.getownpropertysymbols()方法返回乙個陣列,成員是當前物件的所有用作屬性名的symbol 值。

var a = symbol("a");

var b = symbol("b");

var c = symbol("c");

obj =

console.log( object.getownpropertysymbols(obj)) //[symbol(a), symbol(b), symbol(c)]

② symbol.for() 方法

有時候,我們希望重新使用同乙個symbol 值。而symbol.for方法可以做到。

具體實現:它接收乙個字串作為引數,然後搜尋有沒有以該引數作為名稱的symbol 值,如果有,返回這個值,否則就新建並返回乙個以該字串為名稱 的symbol 值。

var a = symbol.for('one');

var b = symbol.for('one');

console.log(a === b) //

true

③ symbol.keyfor() 方法

返回乙個已登記的symbol 型別的key值

例如:

var a = symbol.for('one');

var c = symbol("two");

console.

log(symbol.keyfor(a)); // one

console.

log(symbol.keyfor(c)); // underfined

通過上面的例子可以看出,symbol.keyfor()方法返回乙個登記的symbol 型別值得 key,而直接宣告的 symbol() 沒有。如果你symbol.keyfor()沒有引數,那麼也不會有key值

更多知識點,請看

ES6 資料型別Symbol

1 symbol 定義的屬性,一般方法獲取不到 2 let name symbol 3 let obj 4 name 123 5 name 456 6 獲取symbol元素object.getownpropertysymbols 7object.getownpropertysymbols obj 8...

ES6語法之新資料型別Symbol

1.symbol 新的資料型別,表示乙個不會重複的值 新的資料型別,表示乙個不會重複的值 不是函式,不可以new let sym symbol 33 console.log typeof sym symbol symbol返回的值不會相同 let sym2 symbol aa let sym3 sy...

ES6 新增Symbol資料型別

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