【问题标题】:What's the best way to delete object member and not have undefined left behind删除对象成员并且没有留下未定义的最佳方法是什么
【发布时间】:2016-10-29 14:56:36
【问题描述】:
删除对象成员而不留下未定义的最佳方法是什么
如
var o = {
a: 1,
b: 2,
c: 3
};
delete o['a']
对于 o 的 for 循环将给我们一个未定义的成员。
我已经运行了 lodash,但 _.unset 似乎没有解决问题
谢谢,
肖恩。
【问题讨论】:
标签:
javascript
ecmascript-6
lodash
【解决方案1】:
delete 就是这样。 As adeneo said、delete 不会留下任何东西。一旦你delete o.a,o 就没有a 属性根本。1你看到undefined 的唯一原因是如果你无论如何都要求该属性,因为要求对象上不存在的属性的值会返回undefined.
对于 o 的 for 循环会得到一个未定义的成员
不是任何基于o 实际属性的循环。例如,不是这个:
var o = {
a: 1,
b: 2,
c: 3
}
delete o.a; // delete o['a']; also works
for (var name in o) {
console.log(name + ": " + o[name]);
}
1 实际上,可以创建一个无法删除的属性(通过使该属性不可配置),但可以删除普通属性。以下是创建不可配置属性的方法:
var o = {};
Object.defineProperty(o, "a", {
value: 42,
writable: true,
enumerable: true
});
console.log(o.a); // 42
delete o.a;
console.log(o.a); // still 42
由于不包括configurable: true,我们使该属性不可配置。
如果您使用严格模式,尝试删除不可配置的属性是错误的:
"use strict";
var o = {};
Object.defineProperty(o, "a", {
value: 42,
writable: true,
enumerable: true
});
console.log(o.a); // 42
delete o.a; // throws error
console.log(o.a);
【解决方案2】:
当您尝试获取不存在的属性时,您会得到undefined。如果你不想这样定义一个抛出的方法。
Object.defineProperty(o, 'a', {
get: () => { throw Error("You can't access this property"); }
});
var o = {
a: 1,
b: 2,
c: 3
}
Object.defineProperty(o, 'a', {
get: () => { throw Error("You can't access this property"); }
});
o.a; // Error: You can't access this property
您可能还对代理对象感兴趣:
var o = new Proxy(obj, {
get: function(target, property, receiver) {
if (property in target) return Reflect.get(target, property, receiver);
throw Error("The property does not exist");
}
});
var o = new Proxy({
a: 1,
b: 2,
c: 3
}, {
get: function(target, property, receiver) {
if (property in target) return Reflect.get(target, property, receiver);
throw Error("The property does not exist");
}
});
console.log(o.a); // 1
delete o.a;
console.log(o.a); // Error: The property does not exist