基础
Symbol的值是独一无二的
const s=Symbol('xt')
console.log(s) //Symbol('xt')
console.log(s.toString())
console.log(Boolean(s)) //true
作为属性名
const s=Symbol('name')
const info={
[s]:'xt',
age:18,
sex:'man'
}
console.log(info) //{Symbol(name):'xt'}
info[s]='ljy'
console.log(info) //{Symbol(name):'ljy'}
属性名的遍历
//前四种都无法获取到Symbol的属性名
//第一种
for(const key in info){
console.log(key)
}
//第二种
console.log(Object.keys(info)) //['age','sex']
//第三种
console.log(Object.getOwnPropertyNames(info)) //['age','sex']
//第四种
console.log(JSON.stringify(info)) //{'age':18,'sex':'man'}
//只返回含Symbol的属性名
console.log(Object.getOwnPropertySymbols(info)) //[Symbol(name)]
//返回所有类型的属性名
console.log(Reflect.ownKeys(info)) //['age','sex',Symbol(name)]
Symbol.for 和Symbol.keyFor
const s1=Symbol.for('xt')
const s2=Symbol.for('xt')
console.log(s1===s2) //true
Symbol.keyFor(s2)
console.log(Symbol.keyFor(s2)) //xt
11个内置Symbol值
//Symbol.hasInstance
const obj1={
[Symbol.hasInstance](otherObj){
console.log(otherObj) //{a:'a'}
}
}
console.log({a:'a'} instanceof <any>obj1) //false
//Symbol.isConcatSpreadable
let arr=[1,2]
console.log([].concat(arr,[3,4])) //[1,2,3,4]
console.log(arr[Symbol.isConcatSpreadable]) //undefined
arr[Symbol.isConcatSpreadable]=false
console.log([].concat(arr,[3,4])) //[[1,2],3,4]
console.log(arr[Symbol.isConcatSpreadable]) //false
//Symbol.species
class C extends Array {
constructor(...args){
super(...args)
}
static get[Symbol.species](){
return Array
}
getName(){
return 'xt'
}
}
const c=new C(1,2,3)
const a=c.map(item=>item+1)
console.log(a) //[2,3,4]
console.log(a instanceof C). //false
console.log(a instanceof Array) //true
//Symbol.match
let obj={
[Symbol.match](string){
console.log(string.length)
}
}
'adcde'.match(<RegExp>obj) //5
//Symbol.replace 用法和match一样
//Symbol.search 用法和match一样
//Symbol.split 用法和match一样
//Symbol.iterator
const arr=[1,2,3]
const iterator=arr[Symbol.iterator]()
console.log(iterator) //Array Iterator{}
console.log(iterator.next()) //{value:1,done:false}
console.log(iterator.next()) //{value:2,done:false}
console.log(iterator.next()) //{value:3,done:false}
console.log(iterator.next()) //{value:undefined,true}
//Symbol.toPrimitive
let obj:unkown={
[Symbol.toPrimitive](type){
console.log(type)
}
}
const res=(obj as number)++ //number
const res=`abc${obj}` //string
//Symbol.toStringTag
let obj={
[Symbol.toStringTag]:'xt'
}
console.log(obj.toString()) //[object xt] 注:这是个字符串
let obj={
[Symbol.toStringTag](){
return 'xt'
}
}
console.log(obj.toString()) //[object xt] 注:这是个字符串
//Symbol.
const obj={
a:'a',
b:'b'
}
console.log(Array.prototype[Symbol.unscopables]) //{copeWith:true,entries:true,fill:true,find:true,findIndex:true,includes:true,values:true}
const arr=[1,2]
with(arr){
console.log(filter(item=>item===1)) //[1]
}