TypeScript-2.Symbol类型

笔记。 Symbol是独一无二的值,他可以作为对象的属性名,这样就不会被改写。

const s1 = Symbol()
const s2 = Symbol()
//console.log(s1 === s2) // false

// const s3 = Symbol('Van')

const s4 = Symbol('Van') // s3 === s4 false
// console.log(s4)

//Symbol值不能与其他类型值进行计算
//Symbol值可转换为字符串或布尔值
// console.log(s4.toString())
// console.log(Boolean(s4))
// console.log(!s4)

let prop = 'name'
const info = {
  // name: 'Van'
  [`my${prop}`]: 'Van'
}
console.log(info)

// Symbol值做属性名
const s5 = Symbol('name')
const info2 = {
  [s5]: 'Van',
  age: 18,
  sex: 'male'
}
info2[s5] = 'a'  // 只能通过[]来访问或修改该属性
console.log(info2)

// 遍历对象属性
// 1. for循环
for(const key in info2) { // 打印不了Symbol类型的属性名
  console.log(key) // age sex
}

//2.Object.keys()
console.log(Object.keys(info2)) // ['age', 'sex']
// 打印不了Symbol类型的属性名

//3.Object.getOwnPropertyNames()
console.log(Object.getOwnPropertyNames(info2)) // ['age', 'sex']
// 打印不了Symbol类型的属性名

//4.JSON.stringify()
console.log(JSON.stringify(info2)) // 打印不了Symbol类型的属性名

//5.Object.getOwnPropertySymbols()
//Symbol类型值不是私有属性,是可以访问的
console.log(Object.getOwnPropertySymbols(info2)) // [Symbol(name)]

// 两个方法:Symbol.for() Symbol.keyFor()
// Symbol.for() 创建会先遍历全局(范围:当前页面、Iframe、SerivceWorker) 如果原先创建过 就返回原先的值
const s6 = Symbol.for('Dan') 
const s7 = Symbol.for('Dan') // 再次创建 返回原先的值
// console.log(s6 === s7) // true
// Symbol.keyFor() 传入一个参数,返回Symbol.for()注册时传入的标识
console.log(Symbol.keyFor(s6)) // Dan

ES6 内置Symbol值

// ES6 提供的内置的Symbol值

// 1.Symbol.hasInstance属性,指向一个内部方法。
// 当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法。
Symbol.hasInstance
const obj1 = {
  [Symbol.hasInstance] (otherObj: object) {
    console.log('调用', otherObj)
  }
}
console.log({ a: 'a'} instanceof <any>obj1)

// 2.Symbol.isConcatSpreadable 布尔值
// 符号用于配置某对象作为Array.prototype.concat()方法的参数时是否展开其数组元素。
Symbol.isConcatSpreadable
let array: Array<any> = [1, 2]
let strl: Array<string> = ['a', 'b', 'c']
console.log(array.concat(strl)) // [1, 2, "a", "b", "c"]
array[Symbol.isConcatSpreadable as any] = false // 不展平
console.log(array.concat(strl)) // [[1, 2], "a", "b", "c"]

// 3.Symbol.species
// 指定一个构造函数创建派生对象的函数值属性。
Symbol.species
class C extends Array {
  constructor(...args: any) {
    super(...args)
  }
  static get [Symbol.species] () {
    return Array
  }
}
const c = new C(1, 2, 3)
const a = c.map(item => item + 1)
console.log(a instanceof C) // false
console.log(a instanceof Array) // true

// 4.Symbol.match
// 在调用String.prototype.match()时调用的方法,用于比较字符串
Symbol.match
let obj3 = {
  [Symbol.match] (str: string) {
    console.log('match', str.length)
  },
  [Symbol.split] (str: string) {
    console.log('split', str.length)
  }
}
'abcde'.match(<RegExp>obj3)

// 5.Symbol.replace
// 在调用String.prototype.replace()时调用的方法,用于替换字符串的子串
Symbol.replace

// 6.Symbol.search
// 在调用String.prototype.search()时调用的方法,用于定位子串在字符串中的位置
Symbol.search

// 7.Symbol.split
// 在调用String.prototype.split()时调用的方法,用于分割字符串
Symbol.split
'a,c,s,ee,as'.split(<any>obj3)

// 8.Symbol.iterator
// 方法,被for-of语句调用。返回对象的默认迭代器。
Symbol.iterator
const arr8 = [1, 2, 3, 4, 5]
let iterator = arr8[Symbol.iterator]()
console.log(iterator.next().value)
console.log(iterator.next().value)
console.log(iterator.next().value)

// 9. Symbol.toPrimitive
// 当一个对象转换为对应的原始值时,会调用此函数。
Symbol.toPrimitive
let obj4: unknown = {
    [Symbol.toPrimitive] (type) {
        console.log(type)
    }
}
// const res = (obj4 as number)++
const ress = `acb${obj4}`

// 10. Symbol.toStringTag
// 对应的属性值应该为字符串类型,这个字符串用来表示该对象的自定义类型标签,
// 通常只有内置的 Object.prototype.toString() 方法会去读取这个标签并把它包含在自己的返回值里。
Symbol.toStringTag //2种定义方法
let obj5 = {
    [Symbol.toStringTag]: 'van'
}
let obj6 = {
    get [Symbol.toStringTag] () {
        return 'Van'
    }
}
console.log(obj5.toString()) // [object van]
console.log(obj6.toString())


// 11. Symbol.unscopables
// 用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。(with中无法获取)
Symbol.unscopables
const obj7 = {
    a: 'a',
    b: 'b'
}
// with(obj7) {
//     console.log(a)
//     console.log(b)
// }
console.log(Array.prototype[Symbol.unscopables])
const arr6 = [1, 3, 4]
// with(arr6) {
//     console.log(findIndex(2)) 该属性无法被调用
//     console.log(filter(item => item === 1)) 可以
// }

题外话: 昨天一夜没睡,到中午十一点把HiByeMaMa看完了,哭了一夜我的天,眼睛肿得像傻逼。

摘抄: 人和人之间想要保持长久舒适的关系,靠的是共性和吸引。不是压迫、捆绑、奉承,和一味的付出以及道德式的自我感动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值