根据之前写的文章【JS数据类型转换】(
https://www.toutiao.com/article/7220009788208693820/)可知,可以重写toString或valueOf方法,即可实现该面试题。另外,也可以学习Vue的数据双向绑定 原理,也可实现。
一、采用valueOf或toString,对象进行比较运算时,优先运行valueOf方法,如果得到的不是原始类型数据,则继续运营toString方法,如果得到的 还不是原始类型数据,则报错。
const a = {
n: 1,
// valueOf: function () {
// return this.n++;
// },
toString: function () {
return this.n++;
}
}
或
let a = [1, 2, 3, ];
a.toString = a.shift; // 从开头删除一个
二、采用Object.definePropety,拦截其get方法也可
let n = 1;
Object.defineProperty(window, 'a', {
get() {
return n++;
}
})
三、采用Proxy代理
const a = new Proxy({}, {
n: 1,
get: function () {
return () => this.n++;
}
})