Symbol数据类型
Symbol数据类型
它是js中的第七种数据类型
我不想解释它是谁,我只想知道它是怎么用的,因为那些概念我已经看过无数遍了,但平常几乎没有用过,所以每次看到它还是一头雾水。我今天的目的很简单,就是去用一用它。
使用场景
- 当我想给一个对象添加一个属性,但是又不确定这个对象具体有哪些属性时
let game = {
up(){
console.log('up');
},
down(){
console.log('down');
}
}
let s = Symbol()
game.up[s] = function () { //这里的写法纯属是捡漏
console.log('啦啦啦');
}
game.up() //up
game.up[s]() //啦啦啦
- 比如,我想让这个数组合并的时候不展开(注意,不要小瞧了Symbol,它有一些内置属性还是很有用的)
let a = [1,2,3]
let b = [4,5,6]
b[Symbol.isConcatSpreadable] = false
let c = a.concat(b)
console.log(c); //[1,2,3,[4,5,6]]
//可以在浏览器上观察,更清晰
- 偶然看到一个例子,让我觉得很有趣,仿佛它是一把钥匙,并且这钥匙只有一把
let keychain = {
key1: Symbol(),
key2: Symbol()
}
function getData(key) {
let data = 0
switch (key) {
case keychain.key1:
data = 1
break
case keychain.key2:
data = 2
break
}
return data
}
console.log(getData(keychain.key1)); //1
console.log(getData(keychain.key2)); //2
console.log(getData('asd')); //0
Symbol的相关技术栈
- Object.getOwnPropertySymbols()
let obj = {}
let a = Symbol('hello')
let b = Symbol('world')
obj[a] = 'hello' //注意,属性只能是[]这种写法
obj[b] = 'hello'
console.log(Object.getOwnPropertySymbols(obj)); //[ Symbol(hello), Symbol(world) ]
//获取指定对象的所有 Symbol 属性名
- Reflect.ownKeys()
let obj={
name: 'jack',
[Symbol('age')]: 18
}
console.log(Reflect.ownKeys(obj));
//返回所有类型的键名,包括常规键名和 Symbol 键名
- Symbol.for()
console.log(Symbol('one') === Symbol('one')); //false
console.log(Symbol.for('two') === Symbol.for('two')); //true
console.log(Symbol('three') === Symbol.for('three')); //false
//注意,Symbol.for()仅仅是用来解决名字问题的,它与Symbol()并不相通
//可以这样用
let game={
name: '狼人杀',
[Symbol.for('发言')]: function () {
console.log('我可以发言');
}
}
game[Symbol.for('发言')](); //我可以发言
额外补充
- 巧记js中的六大基本数据类型,还有一种复杂数据类型Object。总共七个。
你是如此的牛逼 You are so niubility 简写为USNB
- U undefined
- S string、symbol
- N null、number
- B boolean
你说你这么牛逼?这七大数据类型应该难不倒你吧
🙋♂️: 小意思😎。
- Symbol 作为属性名,遍历对象的时候,该属性不会出现在
for...in
、for...of
循环中,也不会被Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回。
let obj={}
obj[Symbol('name')] = 'jack'
for (let o in obj){
console.log(o); //没有输出
}
console.log(Object.getOwnPropertyNames(obj)); //[] 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括 Symbol 值作为名称的属性)组成的数组
console.log(Object.getOwnPropertySymbols(obj)); //[ Symbol(name) ]
这一路,灯火通明