TypeScript——Symbol

139 阅读1分钟

概述

ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。 ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。

使用

Symbol 函数栈不能用 new 命令, 因为 Symbol 是原始数据类型,不是对象。

let s1: symbol = Symbol(1);
let s2: symbol = Symbol(1);
console.log(s1 === s2); // false

Symbol是不可改变且唯一的,每一个Symbol都是单独的内存地址存起来的,因此返回false。

思考:如何让两个Symbol返回true呢?

console.log(Symbol.for("qwe") === Symbol.for("qwe")); // true

Symbol.for:全局查找是否注册过, 如果注册过,返回已有的;反之,进行注册。

let obj = {
  name: "qwe",
  [s1]: 111,
  [s2]: 222,
};
console.log(obj); // { name: 'qwe', [Symbol(1)]: 111, [Symbol(1)]: 222 }

Symbol 可以作为key,进而保证key的唯一性

let obj = {
  name: "qwe",
  [s1]: 111,
  [s2]: 222,
};
for (let key in obj) {
  console.log(key); //name
}

for in 不能读取Symbol

let obj = {
  name: "qwe",
  [s1]: 111,
  [s2]: 222,
};
console.log(Object.keys(obj)); // [ 'name' ]

Object.keys 不能读取Symbol

let obj = {
  name: "qwe",
  [s1]: 111,
  [s2]: 222,
};
console.log(Object.getOwnPropertyNames(obj)); // [ 'name' ]

Object.getOwnPropertyNames 不能读取Symbol

let obj = {
  name: "qwe",
  [s1]: 111,
  [s2]: 222,
};
console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(1), Symbol(1) ]

Object.getOwnPropertySymbols 只读取Symbol,其他属性不读取

let obj = {
  name: "qwe",
  [s1]: 111,
  [s2]: 222,
};
console.log(Reflect.ownKeys(obj)); // [ 'name', Symbol(1), Symbol(1) ]

Object.getOwnPropertySymbols 读取Symbol和其他属性(读取对象所有属性)

生成器

迭代器

参考文档

www.runoob.com/w3cnote/es6…

blog.csdn.net/qq119556631…