【问题标题】: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 似乎没有解决问题

谢谢,

肖恩。

【问题讨论】:

  • delete 不会留下任何东西,它会删除
  • @adeneo:这是完美的表达方式。不错。

标签: javascript ecmascript-6 lodash


【解决方案1】:

delete 就是这样。 As adeneo saiddelete 不会留下任何东西。一旦你delete o.ao 就没有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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2013-07-30
      相关资源
      最近更新 更多