一、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