symbol的基本使用和公开符号

96 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

Symbol

Symbol在我以往的开发中使用比较少。今天详细的看看它的特性。方便以后可以在工作中来使用。

  • Symbol是一个基本数据类型
  • Symbol不能支持new来创建。不然会得到TypeError
  • 每个Symbol创建的值都是唯一的。
  • Symbol的值可以作为一个对象数据的属性。也是Symbol类型存在的唯一目的

Symbol 的属性

es6除了定义了原生的Symbol的数据类型外。还提供了预定义的公开符号。通过符号提供给js对象一些元属性。

Symbol.asyncIterator 异步迭代器

当一个对象有这个属性时,他才可以进行一步迭代。可以通过设置对象的[Symbol.asyncIterator]来使得对象可以通过for await .. of循环遍历。目前还没有对象默认设置了这个属性。

Symbol.prototype.description

他是一个只读属性,会返回Symbol对象的可选描述符。如Symbol('desc').descriptiondesc

Symbol.hasInstance

通过这个属性可以实习自定义的instanceof。他会判断某个对象是否为某个构造函数的实例。

Symbol.isConcatSpreadable

该属性可以控制concat方法合并数组的时候。是否展开数组。

const arr1 = [1,2,3]
const arr2 = [4,5,6]
console.log(arr1.concat(arr2))// [1, 2, 3, 4, 5, 6]
arr2[Symbol.isConcatSpreadable] = false
console.log(arr1.concat(arr2))// [1, 2, 3, Array(3)]

Symbol.iterator

该属性被默认定义在一些数据上面。只有具有该属性的对象。才可以通过for...of循环遍历。

let arr = [1,2,3]
console.dir(arr)

image.png 可以在打印值的[[Prototype]]中找到[Symbol.iterator]

Symbol.match

指定匹配规则为正则而不是字符串

Symbol.matchAll

会返回一个迭代器。迭代器会根据字符串生成正则表达式的匹配字符串。

const reg = /[0-9]+/g;
const time = '2022-12-15';
const result = reg[Symbol.matchAll](time);
console.log(Array.from(result,x=>x[0]))// ['2022', '12', '15']

Symbol.replace

指定字符串替换匹配正则的字符串。这个平时工作中用的还是很多的。

Symbol.search

接受一个正则表达式,返回字符串中匹配项目的下标。

Symbol.species

函数值属性。可以改变改写instanceof判断,以改变返回值。

Symbol.split

字符串的分割方法。通过一个正则表达式分割字符串。

Symbol.toPrimitive

在强制类型转换的时候会优先调用。可以把对象转换为原始值。

Symbol.toStringTag

在Object.prototype.toString() 方法调用,可以改写通过Object.prototype.toString.call方法返回的值。

Symbol的方法

Symbol.prototype[@@toPrimitive]

转换Sybmol的类型

Symbol.for()

利用Symbol.for创建的值会被保存。

Symbol.for('a')===Symbol.for('a')

Symbol.keyFor()

该方法可以反向查找通过Symbol.for创建的对象的descript

let test = Symbol.for('a')
let test1 = Symbol('a')
Symbol.keyFor(test) // 'a'
Symbol.keyFor(test1) // undefined

Symbol.prototype.toString()

将创建的Symbol数据转化为字符串

Symbol("a").toString() // 'Symbol(a)'

Symbol.prototype.valueOf()

Symbol无法隐式转换

Object(Symbol("a")).valueOf() // Symbol(a)
Object(Symbol("a")).valueOf()+'123' // Cannot convert a Symbol value to a string