新的原始資料型別:symbol
,表示獨一無二的值
其他的資料型別包括undefined
,null
,string
,number
,boolean
,object
let s = symbol() // 注意不能使用new,因為它不是物件
typeof s // 'symbol'
let s1 = symbol('foo')
s1 // symbol(foo)
// symbol引數是乙個物件,就會呼叫該物件的tostring()方法,然後才生成乙個symbol值
const obj =
}const sym = symbol(obj)
sym // symbol(abc)
let s2 = symbol('foo')
s1 === s2 // false
// symbol值不可以運算
console.log('your symbol ' + s1) // typeerror
// symbol可以顯式轉為字串
string(s1)
sym.tostring() // 'symbol(foo)'
// symbol可以轉為布林值,但是不能轉為數值
boolean(s) // true
!s // false
number(s) // typeerror
可以防止某乙個鍵被改寫或覆蓋
使用symbol值定義屬性時,symbol值必須放在方括號之中。
let mysym = symbol()
let a = {}
a[mysym] = 'hello'
let a =
// 注意點運算子,此時mysym是字串
a.mysym = 'hello'
a[mysym] // undefined
a['mysym'] // 'hello'
屬性名的遍歷
symbol作為屬性名,不會出現在for...in
和for...of
迴圈中,也不會被object.keys()
、object.getownpropertynames()
、json.stringify()
返回,有乙個object.getownpropertysymbols
方法可以獲取symbol屬性名
let obj = {}
let foo = symbol('foo')
object.defineproperty(obj, foo, )
for (let i in obj)
object.getownpropertynames(obj) //
object.getownpropertysymbols(obj) // [symbol(foo)]
還有乙個全新的apireflect.ownkeys()
可以返回所有型別的鍵名,包括常規鍵名和symbol鍵名
let obj =
reflect.ownkeys(obj) // ['enum','nonenum',symbol(my_key)]
let s1 = symbol.for('foo') // 不會每次呼叫就返回乙個新的symbol型別的值
let s2 = symbol.for('bar') // 呼叫30次,每次都返回同乙個symbol值,但是symbol()會返回30個不同的symbol值
s1 === s2 //true
// 返回乙個已登記的symbol型別值的key
let s1 = symbol.for('foo')
symbol.keyfor(s1) // 'foo'
let s2 = symbol('foo')
symbol.keyfor(s2) // undefined
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的物件屬性名都是字串,容易造成屬性名衝突 es6引入新的原始資料型別symbol,表示獨一無二的值 物件屬性名可以有兩種型別 1.字串 2.symbol型別 獨一無二,不會與其他屬性名產生衝突 描述 物件屬性名的問題 只會顯示lucy的名字 obj.name bob obj.name...
ES6新增的symbol資料型別
1 symbol的概念 在es5中,物件屬性名都是字串容易造成屬性名衝突。為了避免這種情況的發生,es6引入了一種新的原始資料型別symbol,表示獨一無二的值。symbol 函式返回的是 symbol 型別的值,該型別具有靜態方法和靜態屬性。let sy1 symbol winne let sy2...