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 = [1, 2, 3, 4];
let it: Iterator = 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 }

未完待续。。。

你可能感兴趣的:(前端,typescript)