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)]

本文深入探讨ES6中新增的基本数据类型Symbol的特性和用法,包括Symbol的创建、描述、作为对象属性名的应用,以及如何使用Symbol.for和Symbol.keyFor进行全局注册和检索。此外,还介绍了ES6内置的Symbol值,如Symbol.isConcatSpreadable、Symbol.species等,并通过实例展示了这些特性如何影响JavaScript的数组操作和对象迭代。
1107

被折叠的 条评论
为什么被折叠?



