es6新加入了一種原始資料型別symbol,表示獨一無二的值,這是js的第七種資料型別,前六種是:undefined、null、布林值(boolean)、字串(string)、數值(number)、物件(object)。
因此,物件的屬性名現在可以有兩種型別,一種是原來就有的字串,另一種就是新增的symbol型別。凡是屬性名屬於symbol型別,就都是獨一無二的,可以保證不會與其他屬性名產生衝突。
//symbol值通過symbol函式生成。
let s =
symbol()
;typeof s// "symbol"
//symbol函式前不能使用new命令,否則會報錯。
//這是因為生成的symbol是乙個原始型別的值,不是物件,所以不能新增屬性。
//基本上,它是一種類似於字串的原始資料型別。
//既然是獨一無二的,那麼我們試試兩個symbol()相等嗎?
let s1 =
symbol()
let s2 =
symbol()
console.
log(s1)
console.
log(s2)
console.
log(s1 === s2)
// false
//symbol函式可以接受乙個字串作為引數,表示對symbol例項的描述
//主要是為了在控制台顯示,或者轉為字串時,比較容易區分。
//這個引數只是表示對當前symbol值的描述,因此相同引數的symbol函式的返回值是不同的symbol例項。
let s1 =
symbol
('fun'
)let s2 =
symbol
('fun'
)console.
log(s1)
console.
log(s2)
console.
log(s1 === s2)
// false
作為屬性名由於每乙個 symbol 值都是不相等的,這意味著 symbol 值可以作為識別符號,用於物件的屬性名,就能保證不會出現同名的屬性。這對於乙個物件由多個模組構成的情況非常有用,能防止某乙個鍵被不小心改寫或覆蓋。
應用場景
比如在乙個班級中,可能會有同學名字相同的情況,這時候使用物件來描述學生資訊的時候,如果直接使用學生姓名作為key會有問題。
//普通的物件
const grade =
, 李四:
, 李四:,}
console.
log(grade)
// 只會保留最後乙個'李四'
//如果使用symbol,同名的學生資訊就不會被覆蓋:
const stu1 =
symbol
('李四'
)const stu2 =
symbol
('李四'
)const grade =
,[stu2]:,
}console.
log(grade)
////symbol(李四): object
//symbol(李四): object
//symbol作為屬性名,該屬性不會出現在for...in、for...of迴圈中,
//也不會被object.keys()、object.getownpropertynames()返回。
//但是,它也不是私有屬性,有乙個object.getownpropertysymbols方法,可以獲取指定物件的所有symbol屬性名。
方法返回乙個陣列,成員是當前物件的所有用作屬性名的symbol值。
let obj =
;let a =
symbol
('a');
let b =
symbol
('b');
obj[a]
='hello'
;obj[b]
='world'
;const objectsymbols = object.
getownpropertysymbols
(obj)
;
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
我們都知道es5 為我們提供了六種資料型別。分別是 物件 object 數字型別 number 布林型別 boolean 字串型別 string 空型別 null 未定義型別 undefind e6又為我們增加了一種型別 symbol 型別,他表示獨一無二的值。這樣下來js 就有七種資料型別了。一 ...
ES6 新增Symbol資料型別
1 symbol 是原始資料型別,不是物件。不能用 new 命令。可以接受乙個字串作為引數,為新建立的 symbol 提供描述。let sy symbol kk console.log sy symbol kk typeof sy symbol 注意相同引數 symbol 返回的值不相等 let s...