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

时间:2018-03-23 16:14:48

标签: javascript arrays object properties

所以我实际上正在阅读关于"删除"的文件。删除对象属性的方法,我偶然发现了这个"另外,你不能删除全局对象的属性,这些属性是用var关键字声明的。"

所以我所理解的是:让我们这样做。说你创建一个数组:

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

然后,如果你试图删除"test1"属性(顺便说一句,我可以调用数组的元素,这是一个对象,数组对象的属性),或者如果你删除for例如:删除testing.length你赢了不能?我不知道我说的话对你有什么影响,请进一步解释?!

3 个答案:

答案 0 :(得分: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"]

length 3。通常,如果要重复删除最后一个元素,则需要使用Array.prototype.spliceshiftpop从数组中删除元素:

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

答案 1 :(得分:0)

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

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

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

console.log(result);

答案 2 :(得分:0)

  

此外,您无法删除使用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)