TypeScript13 - Symbol类型

Symbol · TypeScript中文网 · TypeScript——JavaScript的超级 TS官网

自ECMAScript2015起,Symbol成为了一种新的原生类型,就像String和Number一样

Symbol类型的值是通过Symbol构造函数创建的

可以传递参数作为唯一标识,只支持string和number型的参数

Symbol会将我们传入的值转为字符串,以Symbol的形式输出

let s: symbol = Symbol("abc")
let n: symbol = Symbol(123)
console.log(s, n)
// Symbol(abc) Symbol(123)

Symbol的值是唯一的

因为内存地址的指针位置不同,所以是唯一的

const s1: symbol = Symbol("abc")
const s2: symbol = Symbol("abc")
console.log(s1 === s2)
// 因为内存地址的指针位置不同,所以是唯一的,所以返回false

用作对象属性的键

let sym = Symbol()
let obj = {
    [sym]: "value"
}
console.log(obj[sym])

使用Symbol定义的属性,是不能通过如下方式遍历拿到的

const symbol1 = Symbol("abc")
const symbol2 = Symbol("def")
const obj1 = {
    [symbol1]: "小明",
    [symbol2]: "小红",
    age: 19,
    sex: "女"
}
// 1. for in 遍历
for (const key in obj1) {
    // 注意在console打印key,是拿不到symbol的
    console.log(key)    // age  sex
}

// 2. Object.keys 遍历
console.log(Object.keys(obj1))  // [ 'age', 'sex' ]

// 3. Object.getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj1))   // [ 'age', 'sex' ]

// 4. JSON.stringify()
console.log(JSON.stringify(obj1))   // {"age":19,"sex":"女"}

如何拿到?

// 1. 拿到具体的symbel属性,对象中有几个就会拿到几个
console.log(Object.getOwnPropertySymbols(obj1))
// [ 'age', 'sex', Symbol(abc), Symbol(def) ]

// 2. 通过拦截器,Reflect,拿到对象中所有的属性
console.log(Reflect.ownKeys(obj1))
// [ 'age', 'sex', Symbol(abc), Symbol(def) ]

Symbol.iterator 迭代器 和 生成器 for of

let arr: Array<number> = [1, 2, 3, 4];
let it: Iterator<number> = arr[Symbol.iterator]();

console.log(it.next())  // { value: 1, done: false }
console.log(it.next())  // { value: 2, done: false }
console.log(it.next())  // { value: 3, done: false }
console.log(it.next())  // { value: 4, done: false }
console.log(it.next())  // { value: undefined, done: true }

未完待续。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值