ES6 Symbol类型:
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。es6引入Symbol数据类型(已有Number 、 String 、 Boolean 、 Objec t、 null 和 undefined 类型);
Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
<script type="text/javascript"> let s=Symbol(); console.log(s);//Symbol() console.log(typeof(s));//symbol let s1=Symbol(); console.log(s==s1);//false 凡是属性名属于 Symbol 类型,就都是独一无二的 </script>
Symbol实际使用
<script type="text/javascript"> //Symbol属性的使用 let s = Symbol('sex');//定义属性,参数即属性名 let obj = {name:'jack',age:18}; //向对象里添加额外的属性 //obj.sex='man';//以前的写法,有时属性多的时候会出现属性重复 obj[s] = 'man';//这样能保障属性不重复 console.log(obj,obj[s])//Symbol的属性不能直接用.接属性名 //Symbol属性的遍历 let obj1={name:'jack'}; let s1=Symbol('name'); let s2=Symbol('sex'); obj1[s1]='jack'; obj1[s2]='woman'; for(let i in obj1){//常规遍历无法遍历Symbol属性 console.log(i);//name } console.log(Object.getOwnPropertySymbols(obj1) )//[Symbol(name), Symbol(sex)] 获取所有 Symbol 属性名 console.log(Object.getOwnPropertyNames(obj1))//["name"] 无法获取Symbol 属性名 console.log(Reflect.ownKeys(obj1)) //["name", Symbol(name), Symbol(sex)] 获取所有的属性名 //因为Symbol具有唯一性,所以我们可以做Symbol定义常量 const System_key=Symbol('114aaa'); console.log(System_key); //Symbol.for() // Symbol.for() 全局搜索指定key的Symbol,找到的话,就返回该Symbol,找不到,就新建一个 let s3 = Symbol.for('foo'); let s4 = Symbol.for('foo'); console.log(s3==s4);//true //Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。 // 它们的区别是,前者会被登记在全局环境中供搜索,后者不会。 // Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在, // 如果不存在才会新建一个值 console.log(Symbol.for("bar") === Symbol.for("bar"))//true console.log(Symbol("bar") === Symbol("bar")) //false //Symbol.keyFor() // Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。 let s5 = Symbol.for("foo"); console.log(Symbol.keyFor(s5))//"foo" let s6 = Symbol("foo"); console.log(Symbol.keyFor(s6));// undefined </script>