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自定义的类型描述
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');
以上代码打印结果,可以实现转换:
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');
以上代码打印结果: