获得徽章 0
- 面试小知识:大家肯定知道 Vue 中使用 Object.defineProperty 来对我们写的数据进行拦截,进而实现双向绑定。但是 Object.defineProperty 还有一些地方也会被考察到。
第一个:const 创建的变量不能被修改指针,如果让你用 es5 实现,你会怎么实现?其实就是间接在考察你对 Object.defineProperty 的理解。
```
var _const = function (data, value) {
Object.defineProperty(window, data, {
enumerable: false,
configurable: false,
get: function() {
return value;
},
set: function(v) {
if (v !== value) {
throw Error('xxx.')
} else {
return value;
}
}
})
}
```
第二个:ES6 新增了 Object.is 方法来解决 ES5 中 ==、=== 存在的问题(前者类型转变,后者不能判断 NaN 是否等于 NaN 以及误判 -0 等于 +0)。Object.is 用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。不同之处只有两个:一是 +0 不等于 -0 ,二是 NaN 等于自身。
如果让你用 es5 实现 Object.is ,你会怎么实现?其实也是在间接考察你对 Object.defineProperty 的理解。
```
Object.defineProperty(Object, 'is', {
value: function(x, y) {
if (x === y) {
return x !== 0 || 1 / x === 1 / y;
}
return x !== x && y !== y;
},
configurable: true,
enumerable: false,
writable: true
});
```展开110