ES6-Symbol类型

Symbol类型特点

  • Symbol的值是唯一的,用来解决命名冲突的问题
  • Symbol值不能与其他数据进行运算
  • Symbol定义的对象属性不能使用for...in 循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名

创建Symbol类型的变量

  • 通过new Symbol()来创建
// 创建Symbol
let s = Symbol()
console.log(s, typeof s) // success Symbol() "symbol"

let s2 = Symbol('Symbol类型')
let s3 = Symbol('Symbol类型')
console.log(s2, typeof s2) // success Symbol(Symbol类型) "symbol"
console.log(s2 === s3) // success false
  • 通过Symbol.for()来创建(Symbol.keyFor())

Symbol.for(key) 方法会根据给定的键 key,来从运行时的symbol注册表中找到对应的symbol
如果找到了,则返回它;否则,新建一个与该键关联的symbol, 并放入全局symbol注册表中
所以用Symbol.for()创建的变量会出现相等的情况

Symbol.keyFor()会返回一个已登记(通过Symbol.for()创建的)的Symbol类型值的key

// Symbol.for创建
let s4 = Symbol.for('Symbol类型')
let s5 = Symbol.for('Symbol类型')
console.log(s4, typeof s4) // success Symbol(Symbol类型) "symbol"
console.log(s4 === s5) // success true
console.log(Symbol.keyFor(s4)) // success 'Symbol类型'
  • symbol.description示例属性
var s = Symbol('Symbol类型的描述')
console.log(s.toString()) // suuccess 'Symbol('Symbol类型的描述')'
console.log(s.description) // success 'Symbol类型的描述'

Symbol类型的运算和对比

Symbol不能与其他数据进行

Symbol可以调用toString方法,显示转换为字符串

Symbol值也可以转为布尔值,但是不能转为数值

let s = Symbol()
s += 100
console.log(s) // error Uncaught TypeError: Cannot convert a Symbol value to a number

let s1 = Symbol()
console.log(s1 > 100) // error Uncaught TypeError: Cannot convert a Symbol value to a number

let s2 = Symbol()
`your symbol is ` + s2 // error can't convert symbol to string
s2.toString()  // success 'Symbol()'

let s3 = Symbol()
Boolean(s3) // success true
!s3 // false true

创建Symnol类型的对象属性

  • 提前创建Symbol类型的变量
var game = {
    name: '俄罗斯方块',
    up: () => {
        console.log('up')
    },
    down: () => {
        console.log('down')
    }
}
var methods = {
    up: Symbol(),
    down: Symbol(),
}

game[methods.up] = function () {
    console.log('改变形状')
}
game[methods.down] = function () {
    console.log('快速下降')
}

game[methods.down]() // success 快速下降
game[methods.up]() // success 改变形状
  • 利用ES6新增的表达式定义属性名
var say = Symbol('say')
var vote = Symbol('vote')
var game2 = {
    name: '狼人杀',
    [say] : function () {
        console.log('发言')
    },
    [vote] : function () {
        console.log('投票')
    }
}
game2[say]()  // 发言
game2[vote]() // 投票
  • 不能用Symbol()直接作为属性名 因为这是一个表达式 不是一个固定的值
var game3 = {
    name: '黄金矿工',
    Symbol('down') : function() {
        console.log('放钩子')
    } // error 编辑器报错
}

获取对象属性的几种方式

  • Reflect.ownKeys() 由目标对象自身的属性键组成的数组
  • Object.getOwnPropertySymbols() 由目标对象自身的Symbol类型的属性键组成的数组
  • Object.getOwnPropertyNames() 由目标对象自身的属性键(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
  • Object.keys() 由目标对象自身的属性键(不包括不可枚举属性和Symbol值作为名称的属性)组成的数组
  • Reflect.ownKeys() = Object.getOwnPropertyNames().concat(Object.getOwnPropertySymbols())
var say = Symbol('say')
var vote = Symbol('vote')
var game2 = {
    name: '狼人杀',
    [say] : function () {
        console.log('发言')
    },
    [vote] : function () {
        console.log('投票')
    }
}
Object.defineProperty(game2, 'age', {
    enumerable: false,
    value: 12
})
console.log(Reflect.ownKeys(game2)) // success ['name', 'age', 'Symbol(say)', 'Symbol(vote)']
console.log(Object.getOwnPropertyNames(game2)) // success ['name', 'age']
console.log(Object.getOwnPropertySymbols(game2)) // success ['Symbol(say)', 'Symbol(vote)']
console.log(Object.keys(game2)) // ['name']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值