开启掘金成长之旅!这是我参与「掘金日新计划 · 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').description为desc
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)
可以在打印值的[[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