var val = 0 Object.defineProperty(window, 'a', { get: function () { return ++val } }) console.log((a == 1 && a == 2 && a == 3));
时间: 2024-02-14 10:10:41 浏览: 58
这是一个有趣的 JavaScript 面试题,它的答案是可以通过自定义对象的 getter 方法来实现。我们可以通过 Object.defineProperty() 方法将 window 对象的属性 a 的 getter 方法定义为一个每次返回递增值的函数,然后在判断表达式中连续使用三次 a,由于 a 的 getter 方法每次都会返回递增值,所以最终的判断表达式的结果为 true。
具体实现如下:
```
var val = 0;
Object.defineProperty(window, 'a', {
get: function () {
return ++val;
}
});
console.log((a == 1 && a == 2 && a == 3)); // true
```
这种方法利用了 JavaScript 中的类型转换和隐式类型转换的特性,虽然看起来有些 hacky,但在某些场景下可以发挥很好的作用。
相关问题
用Object.defineProperty怎么实现
数据劫持?
使用Object.defineProperty可以实现数据劫持。数据劫持指的是在数据被改变之前,先进行一些处理或者验证,然后再将数据进行更新。数据劫持可以用于Vue.js等前端框架中,以便实现响应式数据更新。
下面是一个使用Object.defineProperty实现数据劫持的例子:
```javascript
// 定义一个对象
let obj = {
name: '张三',
age: 18
};
// 使用Object.defineProperty对name属性进行数据劫持
Object.defineProperty(obj, 'name', {
get: function() {
console.log('获取name属性');
return this._name;
},
set: function(val) {
console.log('设置name属性为:' + val);
this._name = val;
}
});
// 修改name属性的值
obj.name = '李四';
console.log(obj.name);
// 输出:
// 设置name属性为:李四
// 获取name属性
// 李四
```
在上面的例子中,我们使用了Object.defineProperty来对obj对象中的name属性进行数据劫持。我们通过get和set方法来定义了获取和设置属性值时的行为。在设置属性值时,我们输出了一个日志,以便观察属性值的修改情况。
当我们修改obj对象的name属性时,会触发数据劫持,即先执行set方法,然后输出设置属性的日志。当我们获取obj对象的name属性时,也会触发数据劫持,即先执行get方法,然后输出获取属性的日志。
阅读全文