Symbol的常量的用法介绍(toStringTag、toPrimitive、iterator)

83 阅读1分钟
1. Symbol.toStringTag
  • ES6提供的底层类型标注,可以修改对类型的描述
function Person() { }
// ES6提供的底层类型标注
Person.prototype[Symbol.toStringTag] = Person.name; // 修改Person对象的类型描述
let obj1 = new Person();

let ts = Object.prototype.toString
let type1 = ts.call(obj1);// 获取Person对象的原型
let type2 = ts.call({}) // 获取空对象的原型
console.log(type1); // [object Person]
console.log(type2); //[object Object]
console.log(typeof obj1) // object
console.log(typeof {}) // object

以上代码打印结果:可以看到我们通过toStringTag自定义的类型描述

image.png

2. Symbol.toPrimitive
  • 引用数据类型在做基本数据类型转换时的底层行为(比如+ - * /等行为)
// 正常情况对象是不能进行加减操作的,obj1 - 1会得到NAN的结果
let obj1 = { name: 'Green', age: 36 };
// 这里重新定义Symbol.toPrimitive对应的函数,给其自定义返回值
obj1.__proto__[Symbol.toPrimitive] = function () {
  return this.age;
}
// 可以打印出 35
console.log(obj1 - 1); // 35
3. Symbol.iterator
  • 设置obj的迭代方式
  • 以下代码实现map => object
// map => object
let map = new Map([['a', 1], ['b', 2]]);
let obj = Object.fromEntries(map);

obj.c = 3;

let i = 0;
// 设置obj的迭代方式
obj.__proto__[Symbol.iterator] = function () {
  let entries = Object.entries(this);
  let index = 0;
  return {
    next: () => {
      let done = index >= entries.length;
      let value = entries[index++];
      return {
        value,
        done
      }
    }
  }
}
let map2 = new Map(obj);
// for(let val of obj) {
//     console.log(val,'xx')
// }
console.log(map2, 'map2'); 

以上代码打印结果,可以实现转换:

image.png

4. 日常应用是,Map和object相互转换的方法
  • new Map(Object.entries(obj))
  • Object.fromEntries(map)
let obj = { a: 1, b: 2 };

let map = new Map(Object.entries(obj));
console.log(map, 'map');

map.set('c', 3);

let obj2 = Object.fromEntries(map);
console.log(obj2, 'obj');

以上代码打印结果:

image.png