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,表示独一无二的数据~
那这个时候就好办了。
特点:
-
symbol函数前不能使用new关键字,否则会报错,这是因为symbol是原始数据类型,而不是对象,所以不能添加属性。
let s = Symbol(); typeof s; //"symbol"
-
symbol可以接受一个字符串作为参数,表示对Symbol的描述,主要是在控制台显示时容易区分
-
这个参数可以不加,如果不加在控制台输出就是两个Symbol()不利于区分,加上参数就是为了加以区分。
var s1 = Symbol("foo"); var s2 = Symbol("bar"); s1 // Symbol("foo") s2 // Symbol("bar") s1.toString() // "Symbol(foo)" s2.toString() // "Symbol(bar)"
-
Symbol不能与其他值进行运算,否则会报错
-
Symbol是唯一的与谁都不相等
var re1 = Symbol('hello'); var re2 = Symbol('hello'); console.log(re1, re2); console.log(re1 == re2); //经过验证,虽然re1和re2打印出来显示的一模一样,但是他们却不相等
-
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