JS 内置的 Symbol 值
Symbol.hasInstance
对象的 Symbol.hasInstance 属性,指向一个内部方法。当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法。比如,foo instanceof Foo 在语言内部,实际调用的是 Foo Symbol.hasInstance。
class MyClass {
[Symbol.hasInstance](foo) {
return foo instanceof Array
}
}
[1, 2, 3] instanceof new MyClass() // true
上面代码中,MyClass 是一个类,new MyClass() 会返回一个实例。该实例的 Symbol.hasInstance 方法,会在进行 instanceof 运算时自动调用,判断左侧的运算子是否为 Array 的实例。
Symbol.isConcatSpreadable
对象的 Symbol.isConcatSpreadable 属性等于一个布尔值,表示该对象用于 Array.prototype.concat() 时,是否可以展开。
let arr1 = ['c', 'd']
['a', 'b'].concat(arr1, 'e') // ['a', 'b', 'c', 'd', 'e']
arr1[Symbol.isConcatSpreadable] // undefined(或者 true) 可以展开
let arr2 = ['c', 'd']
arr2[Symbol.isConcatSpreadable] = false //false 不可展开
['a', 'b'].concat(arr2, 'e') // ['a', 'b', ['c','d'], 'e']
类似数组的对象默认不展开
let obj = {length: 2, 0: 'c', 1: 'd'}
['a', 'b'].concat(obj, 'e') // ['a', 'b', obj, 'e']
obj[Symbol.isConcatSpreadable] = true
['a', 'b'].concat(obj, 'e') // ['a', 'b', 'c', 'd', 'e']
Symbol.species(略)
Symbol.match
String.prototype.match(regexp)
// 等同于
regexp[Symbol.match](this)
Symbol.replace
String.prototype.replace(searchValue, replaceValue)
// 等同于
searchValue[Symbol.replace](this, replaceValue)
Symbol.search
String.prototype.search(regexp)
// 等同于
regexp[Symbol.search](this)
Symbol.split
String.prototype.split(separator, limit)
// 等同于
separator[Symbol.split](this, limit)
Symbol.iterator
指向该对象的默认遍历器方法
Symbol.toPrimitive
指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值
Symbol.unscopables
指向一个对象。该对象指定了使用 with 关键字时,哪些属性会被 with 环境排除。
Symbol.toStringTag
可以用来表示对象的自定义类型标签
const a = {}
Object.prototype.toString.call(a) // '[object Object]'
Object.defineProperty(a, Symbol.toStringTag, { value: 'Module' })
Object.prototype.toString.call(a) // '[object Module]'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: JS Symbol 数据类型
下一篇: TypeScript 常见问题
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论