JavaScript学习笔记(十九)——symbol

symbol

es5中的五种基本类型:

Boolean string number undefined null

es6中新增一种基本数据类型:symbol

先看一个案例:

假如不是用劫持call()、apply()和bind()方法 ,怎样实现obj2调用obj里面的方法

var obj={fn:function(){console.lg(this)}};
var obj2={};
obj2.fn=obj.fn;
obj2.fn()
//将obj中的方法添加到obj2中,在使用obj2调用这个方法。

但是假设obj2里面本身就有fn这个函数,如果我们还是使用上面这种方法的话,就会被覆盖掉。

var obj={fn:function(){console.lg(this)}};
var obj2={
    fn:function(){
        //不重要的代码
    }
};
obj2.fn=obj.fn;
obj2.fn()

所以es6出来的新基本数据类型symbol,表示独一无二的数据~

那这个时候就好办了。

特点:

  1. symbol函数前不能使用new关键字,否则会报错,这是因为symbol是原始数据类型,而不是对象,所以不能添加属性。

    let s = Symbol();
    typeof s;
    //"symbol"
  2. symbol可以接受一个字符串作为参数,表示对Symbol的描述,主要是在控制台显示时容易区分

  3. 这个参数可以不加,如果不加在控制台输出就是两个Symbol()不利于区分,加上参数就是为了加以区分。

    var s1 = Symbol("foo");
    var s2 = Symbol("bar");
    ​
    s1 // Symbol("foo")
    s2 // Symbol("bar")
    s1.toString() // "Symbol(foo)"
    s2.toString() // "Symbol(bar)"
  4. Symbol不能与其他值进行运算,否则会报错

  5. Symbol是唯一的与谁都不相等

    var re1 = Symbol('hello');
    var re2 = Symbol('hello');
    console.log(re1, re2);
    console.log(re1 == re2);
    //经过验证,虽然re1和re2打印出来显示的一模一样,但是他们却不相等
  6. Symbol 可以显示的转为字符串,布尔值,但是不能转为数字,转为数字会报错

现在我们再回过头来看看刚开始的案例,可以这样解决:

        var obj = {
            fn: function () {
                console.log(this.name)
            }
        };
        var obj2 = {
            name: 'jack',
            fn: function () {
                console.log(666666);
            }
        };
        var fn = Symbol();
        obj2[fn] = obj.fn;
        obj2[fn]();    //打印jack
 
posted @ 2022-06-19 16:46  小狐狸ya  阅读(36)  评论(0编辑  收藏  举报