es6引入了一种全新的原始数据类型,表示独一无二的值,他是javascript语言的第七种数据类型,是一直类似于字符串的数据类型。
symbol 文档
特点
- Symbol 的值是惟一的,用来解决命名冲突的问题
- Symbol 值不能与其它数据进行运算
- Symbol 定义的对象属性不能使用 for…in 循环遍历,但是可以使用
Reflect.ownKeys
来获取对象的所要键名
使用
// 创建Symbol
let s = Symbol()
console.log(typeof s) // 'Symbol'
let s2 = Symbol('标识')
let s3 = Symbol('标识')
console.log(s2 === s3) // false
// Symbol.for 创建
let s4 = Symbol.for('标识')
let s5 = Symbol.for('标识')
console.log(s4 === s5) // true
不能与其它数据进行运算对比
// USONB
// u undfined
// s srting symbol
// o object
// n null number
// b boolean
let s2 = Symbol('标识')
// let res = s2 + 100
// let res = s2 + s2
Symbol创建对象属性
给对象添加属性和方法(不能确定是否已经存在)
// 常规添加属性和方法
let gObj = {
up:function(){
console.log('我是 原来的 up方法')
}
// ...
}
// 声明一个对象
let methods = {
up: Symbol()
}
gObj[methods.up] = function(){
console.log('Symbol 值 我是一个新的up方法')
}
// 或者
// let gObj = {
// [Symbol()]:function(){
// console.log('Symbol 值 我是一个新的up方法')
// }
// }
// 调用
// gObj[methods.up]()
symbol方法
Symbol.hasInstance
当其它对象使用instanceof 运算符,判断是否为该对象的实例时,会调用改方法
class MyArray {
static [Symbol.hasInstance](instance) {
// instance => arr
console.log('我被用来检测类型了')
// 可以自己控制类型检测
return Array.isArray(instance);
}
}
let arr = []
console.log(arr instanceof MyArray); // true
Symbol.isConcatSpreadable
对象的 Symbol.isConcatSpreadable 属性 是一个布尔值,表示该对象用于 Array.prototype.concat()时是否可以展开
const arr = [1,2,3]
const arr2 = [4,5,6]
arr.concat(arr2) // [1,2,3,4,5,6]
arr2[Symbol.isConcatSpreadable] = false
arr.concat(arr2) // [1,2,3,[4,5,6]]
Symbol.prototype.description 获取symbol 标识
let s = Symbol('标识')
s.description // 标识