Symbol数据类型

127 阅读2分钟

ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值

1.symbol的值是唯一的 用来解决命名冲突的问题

let s = Symbol()
console.log(s)//Symbol()----红色字体
console.log(typeof s)//symbol----黑色字体
// 参数是用来给程序员做提醒,提醒程序员symbol代表的是谁
let s = Symbol("小红");
let body = Symbol("小红");
console.log(s === body);//false
console.log(s == body);//false

2. symbol不能与其他数据进行运算

let s3 = Symbol(123);
console.log(s3);//Symbol(123)
console.log(s3+11);//Uncaught TypeError: Cannot convert a Symbol value to a number

给对象设置独一无二的属性

方法1:在外部给对象添加属性

    let game = {
        name:'俄罗斯方块',
    };
    // 声明一个symbol的值
    let up = Symbol("up");
    let up1 = Symbol("up");
    // 把Symbol的值 作为对象的属性 给对象添加上去 
    game[up] = function(){//game[up]=game[" Symbol("up")"];
    给对象添加属性 可以用[],.不行 因为[]可以是把变量的值当做属性名添加上去。
    而.是把变量名当做属性名添加上去
        console.log("上1");
    };
    game[up1] = function(){
        console.log("上2");
    };
    //调用这些方法的时候 也必须用[],[]会把变量的值作为属性名,
    而.会把变量名作为真实的属性名调用.调用出来的结果就是undefined
    game[up]();//上1
    game[up1]();//上2

方法2:在对象内部直接添加属性

    //声明一个Symbol的值
    let down = Symbol("down");
    let down1 = Symbol("down")
    let game1 = {
            name: '俄罗斯方块',
            // 把Symbol的值 作为对象的属性 给对象添加上去 
            [down]:function(){//属性名真实是这个-->Symbol("down")
                console.log("下1");
            },
            down:function(){
                console.log("下");
            },
            [down1]:function(){//属性名真实是这个-->Symbol("down")
                console.log("下2");
            },
            down:function(){//会覆盖操作 而Symbol不会
                console.log("下down");
            }
        };
        game1[down]();//下1
        game1.down();//下down
        game1[down1]();//下2
        game1["down"]();//下down

我们可能疑惑为什么要加[down]和[down1],直接down和down1不就行了,或者说为什么学Symbol 不是更麻烦了么?

因为在实际项目中,我们是多人协作,有人负责俄罗斯方块的下的动作,有人负责俄罗斯方块向下的动作特效,
俩个人在操作game这个对象时 在添加对象方法时都想叫down是不是会发生属性同名,进行覆盖。
那么Symbol的强大的功能就体现出来了。