gpt4 book ai didi

javascript - 为什么删除会保留数组元素?

转载 作者:可可西里 更新时间:2023-11-01 02:18:15 25 4
gpt4 key购买 nike

今天我在 Stack Overflow 上偶然发现了一个问题 - How do I remove objects from a javascript associative array? .令我震惊的是,被接受的答案既具有误导性,又受到大量支持,因此我强调了可能存在的陷阱。

但是,在拼凑一个更正答案时,我意识到我不知道为什么 delete 保留元素 assign undefined 而不是删除。

var elements = new Array()
elements.push(NaN)
elements.push(NaN)
elements.push(NaN)
delete elements[1]
console.log("number of elements: ", elements.length) // returns 3

背后有什么道理吗?

最佳答案

I realized I have no idea as to why it makes sense for delete to assign undefined instead of removal.

事实并非如此。 delete 从对象中删除属性,它不会将它们设置为未定义。这是一个简单的判断方法:

var a = ['a', 'b', 'c'];
console.log(1 in a); // logs "true"
delete a[1];
console.log(1 in a); // logs "false"

请注意,在删除 之后,a 不再具有名为1 的属性。完全没有。

对比:

var a = ['a', 'b', 'c'];
console.log(1 in a); // logs "true"
a[1] = undefined;
console.log(1 in a); // logs "true"

那里,a 仍然有一个名为1 的属性,只是该属性的值为undefined。

了解 JavaScript 中的 arrays aren't really arrays at all 很有用.它们只是对象,数组“索引”只是属性名称(是字符串——是的,真的,我们只是倾向于将它们写成数字),数组对全是数字的属性名称(索引)有特殊处理,一个特殊的length 属性,以及它们从 Array.prototype 获得的一些函数。这在 Section 15.4 中非常清楚地列出。的规范。一旦您牢牢记住 JavaScript 数组并不是真正的数组,它们就更有意义了。 :-)

从数组中删除数组“索引”属性不会更改其长度(即使删除编号最大的一个也不会);它只是在数组中创建一个洞(JavaScript“数组”本质上是稀疏数组;例如,它们可以有间隙)。因此,在我上面的第一个示例中,我得到的数组与我这样做时得到的数组完全相同:

var a = [];
a[0] = 'a';
a[2] = 'c';

注意间隙,数组没有 1 元素/属性。

如果你说:

var foo = a[3];

...foo 可以得到值 undefined 有两个完全不同的原因:

  1. a 有一个名为 3 的属性,其值为 undefined,或者:
  2. a 根本没有名为 3 的属性;对不具有该名称属性的对象进行属性访问器操作的结果是 undefined。这个 if-no-property-return-undefined 以相当复杂的方式包含在规范中,但主要在 Section 8.12.3 中。 .

这些是非常不同的东西。

关于javascript - 为什么删除会保留数组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9974451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com