symbol 是es6语法下定义的第七种数据类型symbol,表示独一无二的值的意思,且申明一个symbol不能用new
(前六种数据类型:基本数据类型:null,undefined,number,string,boolean,复杂数据类型:object)
以前对象的属性名都是字符串,现在就可以是symbol类型了
let sym1=Symbol("a"); // 不可以加new 关键字 let sym2=Symbol("a"); let a1="a"; let a2="a"; a1===a2; //true sym1===sym2; //false 改造方法:两个同名的属性,但完全表示两个不同的key rectangle const shapeType = { triangle: Symbol("triangle"), rectangle: Symbol("rectangle"), rectangle1: Symbol("rectangle") }; /**ps:该属性不会出现在for...in,for...of循环中,也不会被Object.keys(),Object.getOwnPropertyNames(),JSON.stringify()返回。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。**/ function getArea(shape) { let area = 0; switch (shape) { case shapeType.rectangle: alert("rectangle"); break; case shapeType.rectangle1: alert("rectangle1"); break; } return area; } getArea(shapeType.rectangle1); // 代码避免魔法字符串是个良好的编程习惯// 迭代器的作用
内置类型拥有默认的@@iterator方法:
Array.prototype[@@iterator]() TypedArray.prototype[@@iterator]() String.prototype[@@iterator]() Map.prototype[@@iterator]() Set.prototype[@@iterator]()用法:
let arr = ['a', 'b', 'c']; let iter = arr[Symbol.iterator](); alert(iter.next().value);//a iter.next():{value:a,done:false} iter.next(); //b alert(iter.next().value); //citer.next() //{value:undeinfed,done:true}