美文网首页
TypeScript学习3、ES6 Symbol

TypeScript学习3、ES6 Symbol

作者: 喜欢骑着蜗牛散步 | 来源:发表于2019-10-17 14:13 被阅读0次

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。

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

Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,可用于调试但不能访问symbol本身。

const s3 = Symbol('hello');

传入数字会当做字符串处理

const s4 = Symbol(123);

每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符,Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。Symbol 值作为对象属性名时,不能用点运算符,要使用[]。

let prop = 'name';
let info = {
    [prop]:'tina'
}
console.log(info[prop]) //tina
let s5 = Symbol('name');
let info2 = {
    [s5]: 'tina',
    age: 18
}
info2[s5] = 'bob'
console.log(info2[s5]) //'bob'

当使用了Symbol作为对象的属性的标识符后,在对该对象进行key的枚举时。
for in:未找到Symbol属性的标识符。

for (const key in info2) {
    console.log(key)// age
}

Object.keys(obj):未找到Symbol属性的标识符。

console.log(Object.keys(info2)) //[age]

Object.getOwnPropertyNames(obj):未找到Symbol属性的标识符。

console.log(Object.getOwnPropertyNames(info2))//[age]

JSON.stringify(obj):未找到Symbol属性的标识符。

console.log(JSON.stringify(info2)) //{"age":18}

有上述代码可知Symbol类型的属性描述符,它未被包含到自身属性名集合中,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。


当然也有专门获取对象中Symbol属性的标识符的方法Object.getOwnPropertySymbols(obj)和Reflect.ownKeys(obj)

console.log(Object.getOwnPropertySymbols(info2))  //[Symbol(name)]
console.log(Reflect.ownKeys(info2)) //["age", Symbol(name)]

Symbol 静态方法
Symbol.for(key)使用给定的key搜索现有的symbol,如果找到则返回该symbol。否则将使用给定的key在全局symbol注册表中创建一个新的symbol。

let s6 =  Symbol.for('s6');
let _s6 = Symbol.for('s6');
console.log(s6 === _s6) //true

Symbol.keyFor(sym)从使用Symbol.for(key)注册的全局symbol中,为给定的symbol检索一个共享的?symbol key。

console.log(Symbol.keyFor(s6)); //'s6'

es6自带的Symbol值

Symbol.iterator
一个返回一个对象默认迭代器的方法。被 for...of 使用。

Symbol.asyncIterator
一个返回对象默认的异步迭代器的方法。被 for await of 使用。

Symbol.match
一个用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。被 String.prototype.match() 使用。

Symbol.replace
一个替换匹配字符串的子串的方法. 被 String.prototype.replace() 使用。

Symbol.search
一个返回一个字符串中与正则表达式相匹配的索引的方法。被String.prototype.search() 使用。

Symbol.split
一个在匹配正则表达式的索引处拆分一个字符串的方法.。被 String.prototype.split() 使用。

Symbol.hasInstance
一个确定一个构造器对象识别的对象是否为它的实例的方法。被 instanceof 使用。

Symbol.isConcatSpreadable
一个布尔值,表明一个对象是否应该flattened为它的数组元素。被 Array.prototype.concat() 使用。

Symbol.unscopables
拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。

Symbol.species
一个用于创建派生对象的构造器函数。

Symbol.toPrimitive
一个将对象转化为基本数据类型的方法。

Symbol.toStringTag
用于对象的默认描述的字符串值。被 Object.prototype.toString() 使用。

相关文章

  • TypeScript学习3、ES6 Symbol

    ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。 Symbol 函数可以接受一个字符串作为参数,...

  • TypeScript 学习笔记

    学习Typescript 之前 要搞清楚 javascript typescript es6 三者的关系ES6是什...

  • TS学习笔记(九):Symbol 和模块

    在 TypeScript 里面使用 Symbol 和模块,实质和 ES6 中的使用方法基本一致,没什么新鲜的玩法。...

  • 【TS】使用Symbol报错

    使用webstorm写typescript时,Symbol会报错:cannot find name 'Symbol...

  • ES6补充以及Node事件轮询

    Symbol es6中新增了symbol类型,symbol类型的值是通过symbol函数生成的,相同symbol函...

  • 深入理解ES6六

    Symbol ES6新增的数据类型Symbol 创建Symbol:通过去全局的Symbol函数创建一个Symbol...

  • es6中的数据类型之symbol

    1. symbol es6中的数据类型有:number, boolean, string, symbol, nul...

  • ES6学习-Symbol

    1.Symbol ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的...

  • ES6学习☞Symbol

    概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加...

  • TypeScript基础入门之Symbols

    转发 # TypeScript基础入门之Symbols 介绍 自ECMAScript 2015起,symbol成为...

网友评论

      本文标题:TypeScript学习3、ES6 Symbol

      本文链接:https://www.haomeiwen.com/subject/kpgmmctx.html