1、symbol的概念
在es5中,物件屬性名都是字串容易造成屬性名衝突。為了避免這種情況的發生,es6引入了一種新的原始資料型別symbol,表示獨一無二
的值。
symbol() 函式返回的是 symbol 型別的值,該型別具有靜態方法和靜態屬性。
let sy1 =
symbol
("winne");
let sy2 =
symbol
("winne");
console.
log(
typeof sy1)
;// symbol
console.
log(sy1 === sy2)
;// false
注意:
symbol函式不能用new,會報錯。由於symbol是乙個原始型別,不是物件,所以不能新增屬性,它是類似於字串的資料型別。
symbol都是不相等的,即使引數相同。
通常,所有symbol是不同的,但有時我們想相同名詞的symbol是相同的。舉例,我們應用不同部分想訪問名詞為"id"的symbol,當然需要是相同的。
使用 symbol() 函式的語法,不會在你的整個**庫中建立乙個可用的全域性 symbol型別。要建立跨檔案可用的symbol,甚至跨域(每個都有它自己的全域性作用域) , 使用symbol.for("鍵名")
方法會根據給定的鍵 key,來從執行時的 symbol 登錄檔中找到對應鍵名的 symbol,如果找到了,則返回它的值。否則,新建乙個與該鍵關聯的 symbol,並放入全域性 symbol 登錄檔中。這樣就保證通過相同名詞重複訪問獲得相同的symbol。
let a1 = symbol.
for(
'id');
let a2 = symbol.
for(
'id');
console.
log(a1 === a2)
;// true
2、symbol的作用
確保屬性名不同名,且不被覆蓋。
let sy1 =
symbol()
;let sy2 =
symbol()
;let sy3 =
symbol
("name");
let obj =
;obj[sy2]
="es6"
;console.
log(obj)
;//
symbol作為屬性名,該屬性不會出現在 for…in…和 for…of… 迴圈中,也不會被 object.keys(), object.getownpropertynames() 返回。
let sy1 =
symbol()
;let sy2 =
symbol()
;let sy3 =
symbol
("name");
let obj =
;obj[sy2]
="es6"
;for
(let key in obj)
//name
//id
注意:
for…of迴圈不會迴圈物件的key,只會迴圈出陣列的value,因此for…of不能迴圈遍歷普通物件。
如果實在想用for…of來遍歷普通物件的屬性的話,可以通過和object.keys()搭配使用,先獲取物件的所有key的陣列
然後遍歷:
let sy1 =
symbol()
;let sy2 =
symbol()
;let sy3 =
symbol
("name");
let obj =
;obj[sy2]
="es6"
;let objkeys = object.
keys
(obj)
;console.
log(objkeys)
;// ["name","id"]
for(
let key of objkeys )
//name
//id
3、object.getownpropertysymbols()
返回值是儲存自有symbol屬性的鍵名
陣列。原型鏈上的屬性不會被獲取。
let sy1 =
symbol()
;let sy2 =
symbol()
;let sy3 =
symbol
("name");
let obj =
;obj[sy2]
="es6"
;let symbols = object.
getownpropertysymbols
(obj)
;console.
log(symbols)
;// [symbol(), symbol(name), symbol()]
symbols.
foreach
(function
(key,index)
)// symbol() 0 "hi"
// symbol(name) 1 "hello"
// symbol() 2 "es6"
3、reflect.ownkeys()
遍歷出所有
的obj物件中的鍵名,包括symbol鍵名的,返回鍵名的集合陣列。
let sy1 =
symbol()
;let sy2 =
symbol()
;let sy3 =
symbol
("name");
let obj =
;obj[sy2]
="es6"
;let allkeys = reflect.
ownkeys
(obj)
;console.
log(allkeys)
;// ["name", "id", symbol(), symbol(name), symbol()]
allkeys.
foreach
(function
(key,index)
)// "name" 0 "winne"
// "id" 1 66
// symbol() 2 "hi"
// symbol(name) 3 "hello"
// symbol() 4 "es6"
ES6 新增的型別Symbol
symbol 是es6中新增的一種資料型別,是唯一的識別符號,可以作為物件的唯一屬性名 symbol 可以代替乙個常量,指的常量的值唯一 symbol 的特點 唯一性 即使兩個變數型別,值都一樣,也不相等 let id1 symbol id let id2 symbol id console.log...
ES6 新增Symbol資料型別
1 symbol 是原始資料型別,不是物件。不能用 new 命令。可以接受乙個字串作為引數,為新建立的 symbol 提供描述。let sy symbol kk console.log sy symbol kk typeof sy symbol 注意相同引數 symbol 返回的值不相等 let s...
es6 新增的資料型別 symbol
應用場景 es5的物件屬性名都是字串,容易造成屬性名衝突 es6引入新的原始資料型別symbol,表示獨一無二的值 物件屬性名可以有兩種型別 1.字串 2.symbol型別 獨一無二,不會與其他屬性名產生衝突 描述 物件屬性名的問題 只會顯示lucy的名字 obj.name bob obj.name...