symbol
1、symbol引入的意义
symbol表示独一无二的值,可以用于解决对象属性名冲突的问题
2、创建symbol
(1)一般创建(无参数)
let s = Symbol();
console.log(typeof s);//Symbol
注意不用New命令,New是用来生成对象的
(2)可以传入“字符串”参数(用于区分symbol);
let s1 = Symbol('foo');
let s2 = Symbol('bar');
s1.toString()
//"Symbol(foo)"
s2.toString()
//"Symbol(bar)"
(3)可以传入“非字符串”参数,会先调用它的toString()方法来转化为字符串再创建symbol
const obj={
toString(){
return 'abc'
}
}
let sobj=Symbol(obj)
console.log(sobj)
//Symbol(abc)
注意:即使传入参数相同,两个symbol值都是不同的!
3、symbol的使用
(1)Symbol值不能与其他类型的值进行运算,否则会报错。
(3)Symbol值可以显式的转换为布尔值、字符串,但不能转换为数值
(4)作为对象属性名的symbol,保证不会出现同名的属性
Symbol(“foo”) === Symbol(“foo”); // false
比如你添加了一个Symbol(‘toString’)方法,然后给别人用。别人也添加了一个Symbol(‘toString’)方法,大家都不冲突
4、symbol作为属性名
(1)symbol作为属性名的时候不可以使用点运算符symbol必须被放在[ ]中
(2)symbol作为属性名时,该属性不会被for of 、for in、Object.keys()、Object.getOwnPropertyNames()返回
可以被Object.getOwnPropertySymbols()、Reflect.ownKeys()返回
- Object.getOwnPropertySymbols():该方法返回一个数组,包含当前对象的所有用作属性名的symbol值
let obj = {};
let a = Symbol('a');
let b = Symbol('b');
obj[a] = 'Hello';
obj[b] = 'World';
let objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols);
//[Symbol(a), Symbol(b)]
- Reflect.ownKeys():返回所有类型的键名
et o = {
[Symbol('my_key')]: 1,
enum: 2,
nonEnum: 3
};
let r3 = Reflect.ownKeys(o);
console.log(r3);
//["enum", "nonEnum", Symbol(my_key)]
5.symbol方法:Symbol.for()/Symbol.keyFor()
- Symbol.for():接收一个字符串,搜索有没有以该参数作为名称的symbol值,有的话 就返回这个symbol值,没有的话就以这个字符串为名称创建并返回symbol值
- Symbol.keyFor():返回一个已登记的symbo的key
s1 = Symbol.for('foo');
s2 = Symbol.for('foo');
console.log(s1 === s2);//true
console.log(Symbol.keyFor(s1));//'foo'
6、消除魔术字符串—Symbol实例1
魔术字符串:在代码中多次出现并且与代码形成强耦合的字符串
//name age 就是魔法字符串
function get(a){
switch(a){
case 'name'
return "mark" break;
case 'age'
return "18" break;
}
}
(方法1):使用变量代替字符串
let people{
name:"name",
age:"age"
}
function get(a){
switch(a){
case people.name
return "mark" break;
case people.age
return "18" break;
}
}
(方法2):使用symbol
let people{
name:Symbol(),
age:Symbol()
}
function get(a){
switch(a){
case people.name
return "mark" break;
case people.age
return "18" break;
}
}
模块的Singleton模式—symbol实例2
Singleton模式就是单列模式
8、内置的symbol值