ES6精讲 一 Symbol

基础

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]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值