Javascript 删除全局对象中的属性(错误)

Javascript 删除全局对象中的属性(错误),javascript,arrays,object,properties,Javascript,Arrays,Object,Properties,所以我实际上在阅读关于删除对象属性的delete方法的文档,我偶然发现了这一点,您不能删除全局对象的属性,这些属性是用var关键字声明的 所以我所理解的是:假设您创建了一个数组: var测试=[test1,test2,test3] 那么,如果您试图删除test1属性,我可以调用数组的一个元素,它是一个对象,一个数组对象的属性,或者如果您删除例如:delete testing.length,您将无法访问它吗?我不知道我说的话是否对你有意义,请进一步解释 请注意,test1不是一个属性,而是索引0的

所以我实际上在阅读关于删除对象属性的delete方法的文档,我偶然发现了这一点,您不能删除全局对象的属性,这些属性是用var关键字声明的

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

var测试=[test1,test2,test3]

那么,如果您试图删除test1属性,我可以调用数组的一个元素,它是一个对象,一个数组对象的属性,或者如果您删除例如:delete testing.length,您将无法访问它吗?我不知道我说的话是否对你有意义,请进一步解释

请注意,test1不是一个属性,而是索引0的值

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

常量测试=[test1,test2,test3]; const result=testing.filteritem=>item!='测试1’; console.logresult; 此外,您不能删除全局对象的属性,这些属性是用var关键字声明的

delete操作符对变量没有影响,只对属性有影响。虽然这些变量可用,例如window.variable,但delete运算符对这些变量没有影响

如果您试图删除test1属性

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

也许如果您删除了,例如:delete testing.length

数组属性长度是不可配置的属性,因此运算符delete将返回false

var测试=[test1、test2、test3] console.logdelete.length; 然后,如果您试图删除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"]
长度为3。通常,要使用或从数组中删除元素,或者如果要重复删除最后一个元素中的第一个元素:

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

谢谢,我确实明白了这一点,最后一件事那句话的意思是什么:另外,你不能删除全局对象的属性,这些属性是用var关键字声明的。?delete命令对常规变量没有影响,只是属性。尽管这些变量可用,例如window.variable,但delete运算符对这些变量没有影响。@JonasW。是的,我忘了。稍后我会在答案中解决这个问题。对于使用Array.prototype.slice,您应该首先知道值的索引。。当您知道要删除test1的值时,最好使用Array.prototype.filter。。检查我的answer@YosvelQuintero过滤器不会从arra中删除元素;它在不修改现有阵列的情况下创建新阵列。与拼接相比,它有很多开销。如果要删除单个元素,应始终使用splice,但可能需要先使用indexOf或findIndex。就是这样:与indexOf或findIndex结合使用就可以了。。。这适用于仅出现一次test1的情况