ES6中的Symbol
ES5 的对象属性名都是字符串,容易造成重名,污染环境,为防止属性名的冲突。ES6 引入Symbol。
-
概念:ES6中添加了一种原始数据类型symbol。(在ES6之前已有的原始数据类型:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object))
-
特点:
- Symbol属性值对应的值是唯一的,解决命名冲突问题
- Symbol值不能与其他数据进行计算,包括同字符串拼串
- for in,for of 遍历时不会遍历symbol属性
-
使用:
-
调用Symbol函数得到symbol值
//调用Symbol函数 let symbol=Symbol(); //ES6中添加了一种原始数据类型symbol console.log(typeof symbol); //symbol 数据类型为 console.log(symbol) //Symbol() let obj={name:'lily','age':18}; obj[symbol]="abc"; console.log(obj); //{name: "lily", age: 18, Symbol(11): "abc"}
-
传参标识(给Symbol传入参数,就能够分清到底是哪一个值,等于是为它们加上了描述)
let symbol1=Symbol(); let symbol2=Symbol(); //输出都为Symbol(),不利于区分。 console.log(symbol1); //Symbol(); console.log(symbol2); //Symbol(); console.log(symbol1==symbol2); //false; //可以给Symbol传入参数,就能够分清到底是哪一个值,等于是为它们加上了描述 let sym1=Symbol("one"); let sym2=Symbol("two"); //注意,Symbol函数的参数只是表示对当前 Symbol 值的描述 console.log(sym1); //Symbol("one") console.log(sym2); //Symbol("two") console.log(sym1==sym2); //false //注意,Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。 let s1=Symbol("a"); let s2=Symbol("a"); console.log(s1===s2); //false //symbol提供了一个实例属性description,可以直接返回Symbol的描述 console.log(s1.description); //a
symbol提供了一个实例属性description
console.log(s1.description); //a
-
内置Symbol值
除了定义自已使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法Symbol.iterator
对象的Symbol.iterator属性,指向该对象的默认遍历器方法
- 其他:
-
Symbol值可以转换为字符串,不能同字符串拼串
let sym=Symbol("test"); console.log(sym.toString()); //Symbol(test) console.log(typeof sym); //Symbol console.log(typeof sym.toString());//string //Symbol值不能与其他数据进行计算,包括同字符串拼串 //Uncaught TypeError: Cannot convert a Symbol value to a string (报错无法将符号值转换为字符串) console.log("this is"+sym); console.log(`this is ${sym}`);
-
Symbol值可以转换为布尔值,不能转换为数字
console.log(Boolean(sym)); //true //报错不能转换为数字 console.log(Number.parseInt(sym)); //for in,for of 遍历时不会遍历symbol属性 for (let i in obj) { console.log(i); /* * 输出内容 * name * age */ }