ES6中新的基本数据类型Symbol
基本用法
let s1 = Symbol('foo')
let s2 = Symbol('foo')
s1 === s2 // fasle
s1.description // "foo"
作为对象的属性名
let s1 = Symbol('foo')
let obj = {}
obj[s1] = 'hello world' // 以Symbol为键值
遍历对象中的Symbol key
通常方法只能遍历到普通的字符串属性,即
for...in``for...of
循环、Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
。
Object.getOwnPropertySymbols()
、Reflect.ownKeys()
这两个api可以访问到Symbol键名
let o={
a:'abc',
q:'qwe',
[Symbol('foo')]:'sss'
}
Object.getOwnPropertySymbols(o) // [Symbol(foo)]
Reflect.ownKeys(o) // ["a", "q", Symbol(foo)]
Symbol.for() ,Symbol.keyfor()
Symbol.for("bar") === Symbol.for("bar") // true
Symbol("bar") === Symbol("bar") // false
Symbol.keyFor(Symbol.for("foo")) // "foo"
内置的Symbol值
Symbol.keyFor(Symbol.for("foo"))
Symbol.isConcatSpreadable
是一个布尔值,表示对象用于Array.prototype.concat()
时,是否可以展开。(默认 undefined)
let arr=[1,2,3]
let a=[4,5]
a.concat(arr)
// [4, 5, 1, 2, 3]
a[Symbol.isConcatSpreadable]=false
a.concat(arr)
// (4) [Array(2), 1, 2, 3]
arr.concat(a)
// (4) [1, 2, 3, Array(2)]