【问题标题】:Deleting a property in the global object ( misunderstanding )删除全局对象中的一个属性(误解)
【发布时间】:2018-03-23 16:14:47
【问题描述】:

所以我实际上是在阅读有关删除对象属性的“delete”方法的文档,我偶然发现了这个“此外,您不能删除使用 var 关键字声明的全局对象的属性。”

所以我的理解是:假设你创建了一个数组:

var testing = ["test1", "test2", "test3"];

然后,如果您尝试删除 "test1" 属性(顺便说一句,我可以调用数组的元素,它是一个对象,数组对象的属性),或者如果您删除例如:删除 testing.length 你将无法?我不知道我所说的是否对您有意义,请进一步解释?!

【问题讨论】:

    标签: javascript arrays object properties


    【解决方案1】:

    那么如果你尝试删除“test1”属性(顺便说一句,我可以调用数组的元素,它是一个对象,数组对象的属性)。

    该数组没有名为“test1”的属性。它有一个名为"0" 的属性,其值为"test1",但通常认为数组根本没有属性是不好的。数组在技术上是对象,可以像普通对象一样添加诸如“test1”之类的属性,但这几乎总是一个坏主意:

    var testing = ['a','b','c'];
    testing.test1 = 'hello';
    delete testing.test1;
    

    数组元素不是属性,但它们是属性的值,即元素的整数索引:

    var testing = ["test1", "test2", "test3"];
    delete testing[0];
    

    使用delete 运算符从数组中删除元素通常不是您想要做的。以上结果为数组:

    [empty, "test2", "test3"]
    

    带有length3。通常你想使用Array.prototype.spliceshiftpop 从数组中删除一个元素,如果你想重复删除最后一个元素:

    var testing = ["test1", "test2", "test3"];
    testing.splice(0,1); // Delete 1 element from position 0
    // Results in ["test2", "test3"]
    

    【讨论】:

    • 对于使用Array.prototype.slice(),您应该首先知道该值的index。当您知道要删除的值"test1"时,最好使用Array.prototype.filter()..检查我的答案跨度>
    • @YosvelQuintero filter 不会从 arra 中删除元素;它创建一个新数组而不修改现有数组。与拼接相比,它有很多开销。如果要删除单个元素,则应始终使用 splice,但可能需要先使用 indexOffindIndex
    • 就是这样:结合indexOffindIndex 就可以了...这适用于仅出现一次"test1" 的情况
    【解决方案2】:

    注意"test1"不是属性,而是索引0的值。

    当使用数组而不是delete 时,您可以使用Array.prototype.filter() 并在新数组中获取与"test1" 不同的所有元素:

    const testing = ["test1", "test2", "test3"];
    const result = testing.filter(item => item !== 'test1');
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      此外,您不能删除使用 var 关键字声明的全局对象的属性

      delete 运算符对变量没有影响,只对属性有影响。虽然这些变量可以使用,即window.variable delete 运算符对这些变量没有影响。

      如果您尝试删除“test1”属性

      test1 不是属性,而是该数组中的一个元素。

      也许如果你删除例如:delete testing.length

      数组属性长度是一个不可配置的属性,所以操作符delete会返回false。

      var testing = ["test1", "test2", "test3"]
      console.log(delete testing.length);

      如果需要使用运算符delete从数组中移除元素,则需要放置索引,即:array[3]:

      从数组中“移除”一个元素的最佳方法是执行过滤过程,您可以了解更多关于函数Array.prototype.filter()

      var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
      delete trees[3];
      
      console.log(trees);

      另一个使用函数defineProperty的不可配置属性示例:

      var Employee = {};
      Object.defineProperty(Employee, 'name', {configurable: false});
      
      console.log(delete Employee.name);

      您可以从对象中删除可配置属性,如下所示:

      var obj = {test1: "test1", test2: "test2"};
      
      console.log(delete obj.test1);
      console.log(obj);

      或者,如下:

      var Employee = {};
      Object.defineProperty(Employee, 'name', {configurable: true});
      
      console.log(delete Employee.name);
      console.log(Employee)

      【讨论】:

      • 谢谢,我确实明白了这一点,最后一件事是那句话的含义:“另外,您不能删除使用 var 关键字声明的全局对象的属性。”?
      • delete 命令对常规变量没有影响,只对属性有影响。尽管这些变量可以使用,即window.variable,但删除运算符对这些变量没有影响。
      • @JonasW。是的,我忘记了。稍后我会在答案中解决这个问题。
      猜你喜欢
      • 2014-09-11
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多