我們都知道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....in
、for...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...