[JavaScript] 纯文本查看 复制代码
//1.第一种解决方案
var a = {
i: 7,
valueOf: null,
// valueOf: () => {
// // 此处还使用了++操作符 i++ 先使用后赋值
// // ++i 先赋值再使用
// return a.i++
// },
toString: () => {
// 此处还使用了++操作符 i++ 先使用后赋值
// ++i 先赋值再使用
return a.i++
}
}
console.log(a == 7 && a == 8 && a == 9) // true
//2.第二种解决方案
var b = {
i: 1,
k: ''
}
// 该方法会直接在对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象
// Object.defineProperty(obj, prop, descriptor)
// obj 对象 prop 要定义或修改的属性的名称 descriptor 将被定义或修改的属性描述符
Object.defineProperty(b, 'k', {
get: function() {
return b.i++
}
})
console.log(b.k == 1 && b.k == 2 && b.k == 3);
[JavaScript] 纯文本查看 复制代码
//3.第三种解决方法
var a = [1, 2, 3]
a.toString = function() {
console.log('调用了toString')
};
a.join = function() {
console.log('调用了join')
};
a.valueOf = function() {
console.log('调用了valueOf')
};
console.log(a == 1 && a == 2 && a == 3)
//运行结果:console.log('调用了valueOf')
// false
var a = [1, 2, 3]
a.valueOf = a.shift;
a.toString = a.shift;
//对于数组对象,toString 方法返回一个字符串,该字符串由数组中的每个元素的 toString() 返回值经调用 join() 方法连接(由逗号隔开)组成。
//可以看到数组 toString 会调用本身的 join方法,这里把自己的join方法该写为shift,每次返回第一个元素,而且原数组删除第一个值,正好可以使判断成立。这里 == 比较也带来的副作用
// 此处有点儿不明白(toString调用本身的join方法,后面回来补充)
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);// true