删除在数组中的 NodeJS 中真正意味着什么

What delete really means in NodeJS in arrays?

本文关键字:意味着 什么 数组 删除 NodeJS      更新时间:2023-09-26

阅读这个问题的答案,我知道delete为元素设置undefined值。

因此,如果我们有一个数组:a = [1, 2, 3](至少)在客户端使用delete a[1]数组将变得[1, undefined x 1, 3]客户端也是如此

在 NodeJS 中会发生什么?

但是在 NodeJS(服务器端)上测试相同的操作,我得到以下内容:

$ node
> a = [1, 2, 3]
[ 1, 2, 3 ]
> delete a[1]
true
> a
[ 1, , 3 ]
> a[1] = undefined
undefined
> a
[ 1, undefined, 3 ]
> 

因此,a[1] = undefined设置未定义的值。但是两个逗号([1, , 3])之间的空格是什么意思? delete说吧!为什么?

我想这个空间意味着undefined,但为什么它没有显示为undefined只有我将其设置为未定义?

为什么会这样?

当您对数组条目使用 delete 时,它会从数组中删除该条目。 数组长度不会更改,但数组中的插槽已消失。 如果您尝试查看该插槽的值,它将显示为undefined尽管删除它与将其设置为 undefined 并不完全相同。 您可以在此处阅读有关删除数组条目的信息(向下滚动到副标题"删除数组元素")。

此参考还解释了在数组条目上使用 delete 与将其设置为 undefined 之间的区别。 这种差异是微妙的,只有在少数情况下才会产生影响。 以下是该文章中的示例:

// using delete
var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
if (3 in trees) {
    // this does not get executed
}
// setting to undefined
var trees = ["redwood","bay","cedar","oak","maple"];
trees[3]=undefined;
if (3 in trees) {
    // this gets executed
}

因此,此控制台输出:

[ 1, , 3 ]

显示第二个数组条目丢失(它已完全消失)。

有关delete运算符在其他情况下的工作方式的完整概述,请参阅 http://perfectionkills.com/understanding-delete/本文。

语言级别的数组索引的工作方式与任何其他属性类似。

当您访问不存在的属性时,将遍历原型链,直到找到结果,如果未找到结果,则返回undefined。但您也可以将undefined用作正常值。

可能存在重大差异,例如:

Array.prototype[1] = 15;
var a = [1, 2, 3];
delete a[1];
//protip: the above can be written as `var a = [1,,3]`
var b = [1, undefined, 3];
//Logs 15 and undefined
console.log(a[1], b[1]);

a中,因为属性1不存在,所以检查原型并找到值15

b中,因为属性1存在,所以属性的值(undefined)只是直接返回。

此外,数组的控制台格式输出通常在环境之间有所不同,但这并没有真正改变实际发生的情况。