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...infor...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) ]
posted @ 2022-06-02 20:22  朱在春  阅读(60)  评论(0编辑  收藏  举报