Symbol类型

 

  之前的基础数据类型有:字符串、数值、布尔、对象、null和undefined;ES6新增了一种基础数据类型Symbol,表示独一无二的值,类似ID。

  通过 Symbol() 函数生成,生成的是一个原始类型的值,不能使用new命令,直接使用 Symbol() 。

let s=Symbol();
console.log(typeof s); //类型:symbol

       console.log(s);    

 

  Symbol() 函数是可以传参数的,其参数表示对变量的描述,是为了显示的时候方便区分,不可用于属性访问

 

let s=Symbol("s");
let obj={[s]:"123"}
console.log("s" in obj); //false
console.log(s in obj); //true

 

特性:  唯一性

  Symbol是唯一存在的,是否有参数或参数相等,两个Symbol变量都是不等的

let s1=Symbol();
let s2=Symbol();
console.log(s1===s2); //false
let s1=Symbol("s");
let s2=Symbol("s");
console.log(s1===s2); //false

 

无法进行隐式转换,需要提前显示转换匹配类型

console.log(s+"变量");

     无法将符号值转换为字符串

 

  显式转换:

console.log(s.toString()+"变量");  //字符串
console.log(String(s)+"变量"); 
console.log(Boolean(s)); //布尔

  

 

应用场景

 解决对象属性名冲突:

    ES5 的对象属性名都是字符串,这容易造成属性名的冲突。有了Symbol类型,保证每个属性的名字都是独一无二的,这样就从根本上防止属性名的冲突。

 


let a="name",b="name";
let obj={
  [a]:"li",
  [b]:"wang"
}

    console.log(obj);    

   设置两个相同的属性名,前一个属性名的值就会被后面相同属性名的值覆盖。

 

 使用Symbol之后:

let a=Symbol(),b=Symbol();
let obj={
    [a]:"li",
    [b]:"wang"
}

   console.log(obj);   

    两个属性名相同但并不会冲突,值也不会被覆盖。

 

 

  注意:在对象的内部使用 Symbol 值定义属性时,Symbol 值必须放在方括号中

 

posted @ 2021-11-27 15:35  十七日尾  阅读(179)  评论(0)    收藏  举报