Symbol

ES6引入了一种新的数据类型Symbol,表示独一无二的值。

变量定义

  • Symbol()

Symbol声明的变量都是唯一的

  1. let a1=Symbol();
  2. let a2=Symbol();
  3. console.log(a1===a2); //false
  • Symbol.for()

Symbol.for(str)首先会在全局中搜索有没有以该参数作为名称的Symbol值,如果有直接返回;如果没有,新建并返回一个以该字符串为名称的Symbol值。

  1. let a3=Symbol.for('a3');
  2. let a4=Symbol.for('a3');
  3. console.log(a3===a4); // true

遍历

  1. let a1=Symbol.for('abc');
  2. let obj={
  3. [a1]:'123',
  4. 'abc':345,
  5. 'c':456
  6. };
  7. console.log('obj',obj); / /obj Object {abc: 345, c: 456, Symbol(abc): "123"}
  • for of

    使用for of不能遍历出Symbol定义的变量```jsfor(let [key,value] of Object.entries(obj)){console.log(‘let of’,key,value);}

// 输出:let of abc 345 let of c 456

  1. - **getOwnPropertySymbols()**
  2. > getOwnPropertySymbols()只获取Symbol定义的值
  3. ```js
  4. Object.getOwnPropertySymbols(obj).forEach(function(item){
  5. console.log(obj[item]); //123
  6. })
  • ownKeys

    遍历出所有的值```jsReflect.ownKeys(obj).forEach(function(item){console.log(‘ownkeys’,item,obj[item]);})

// 输出:// ownkeys abc 345// ownkeys c 456// ownkeys Symbol(abc) 123

  1. ## iterator
  2. > for-of 语句,它首先调用被遍历集合对象的Symbol.iterator() 方法,该方法返回一个迭代器对象,迭代器对象可以是拥有 .next 方法的任何对象;然后,在 for-of 的每次循环中,都将调用该迭代器对象上的 .next 方法。
  3. ```javascript
  4. {
  5. let arr=['hello','world'];
  6. // 下面这种写法 数组直接调用Symbol.iterator这个接口,这个接口是数组内部已经帮我们实现了的,我们直接调用即可。
  7. let map=arr[Symbol.iterator]();
  8. console.log(map.next());
  9. console.log(map.next());
  10. console.log(map.next());
  11. // 输出结果:done是ture表示没有下一步了,如果是false说明循环并没有结束
  12. // Object {value: "hello", done: false}
  13. // Object {value: "world", done: false}
  14. // Object {value: undefined, done: true}
  15. }
  16. {
  17. //数组索引是从0开始,内置了iterator接口,但是Object并没有帮我们部署Iterator接口。
  18. //对对象 自定义iterator接口,使其可以实现for of循环
  19. let obj={
  20. start:[1,3,2],
  21. end:[7,9,8],
  22. [Symbol.iterator](){
  23. let self=this;
  24. let index=0;
  25. //start 和 end 合并成一个数组
  26. let arr=self.start.concat(self.end);
  27. let len=arr.length;
  28. return {
  29. next(){
  30. if(index<len){
  31. return {
  32. value:arr[index++],
  33. done:false
  34. }
  35. }else{
  36. return {
  37. value:arr[index++],
  38. done:true
  39. }
  40. }
  41. }
  42. }
  43. }
  44. }
  45. for(let key of obj){
  46. console.log(key);
  47. }
  48. }
  49. {
  50. let arr=['hello','world'];
  51. for(let value of arr){
  52. console.log('value',value);
  53. }
  54. }