06.Symbol

一、Symbol特点:

1)Symbol的值是唯一的,用来解决命名冲突的问题。

2)Symbol值不能与其他数据进行运算。

3)Symbol定义的对象属性不能使用for in 循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名。

        //为了解决表示一个独一无二的值。
        //Symbol不能用new命令,可以接受一个字符串作为参数.为创建的Symbol提供描述,
        // 用来显示在控制台或者作为字符串的时候使用,便于区分。
                let sy=Symbol("kk");
                console.log(sy);//Symbol(kk)

        //相同参数,Symbol()返回的值不相等
                let sy1=Symbol("kk");
                sy===sy1;//false

		//Symbol.for创建
                //Symbol.for()
                //首先会在全局搜索被登记的Symbol中是否有该字符串参数作为名称的Symbol值,如果有即返回该Symbol值
                //若没有则新建并返回一个以该字符串参数为名称的Symbol值,并登记在全局环境中供搜索
                let yellow = Symbol("Yellow");
                let yellow1 = Symbol.for("Yellow");
                console.log(yellow===yellow1);  //false
                // yellow=yellow1;//yellow1是Yellow的Symbol值
                let yellow2=Symbol.for("Yellow");//yellow2也是Yellow的Symbol值
                console.log(yellow1===yellow2);//true
          
       //Symbol.keyfor()
                let yelloww=Symbol.for('Yellow');
                console.log(Symbol.keyFor(yelloww));

二、Symbol的使用:

        //作为属性名。由于每一个symbol的值都是不相等的,所以symbol作为对象的属性名,可以保证属性不重名。
                let syy=Symbol("key1");
                //写法1
                let syobj={};
                syobj[syy]='kk';
                console.log(syobj);//{symobj[key1]:'kk'}
                
                //写法2
                let obj={
                    [syy]:'gg',
                }
                console.log(obj);//{obj[key1:'gg']}

                //写法3
                let syobject={};
                Object.defineProperty(syobject,syy,{value:'kg'});
                console.log(syobject);
                console.log(syobject[syy]);
                //需要注意的是,Symbol作为对象属性名时不能用.运算符,要用方括号

三、Symbol的内置属性

1.Symbol.hasInstance 当使用instance判断一个数据类型时候会自动触发该方法

   class Person{
	static [Symbol.hasInstance](param){
		console.log(param); //这是检测的对象o
		console.log("我被用来检测类型了"); 
        return false;//自定义检测返回值
	}
}
let o={}
console.log(o instanceof Person);  //判断一个数据类型

2.isConcatSpreadable 对象的Symbol.isConcatSpreadable属性等于的是一个布尔值,表示该对象用于Array.proptotype.concat()时,是否可以展开。

const arr=[1,2,3];
const arr2=[4,5,6];
arr2[Symbol.isConcatSpreadable]=false;
console.log(arr.concat(arr2));  //[1,2,3,4,5,6];

四、Symbol.protorype.description

   let s=Symbol("lhh");
console.log(s.description);//lhh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值