ES6-symbol

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值
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值