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

阅读这个问题的答案我明白, delete设置元素的undefined值。

所以,如果我们有一个数组: a = [1, 2, 3] (至less)在客户端使用delete a[1] ,数组将变为[1, undefined x 1, 3] 客户端

在NodeJS中会发生什么?

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

 $ 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只是我把它设置为undefined?

为什么发生这种情况?

在数组条目上使用delete时,会从数组中删除该条目。 数组长度没有改变,但是数组中的那个槽没有了。 如果您试图查看该插槽的值,它将显示为undefined但删除它与将其设置为undefined不完全相同。 您可以阅读有关在此删除数组条目(向下滚动到字幕“删除数组元素”)。

这个引用也解释了在数组条目中使用delete与将其设置为undefined的区别。 差别是微妙的,只有在less数情况下才会有所不同。 下面是该文章的一个例子:

 // 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 ] 

向您显示第二个数组项目丢失(完全消失)。

请参阅本文http://perfectionkills.com/understanding-delete/ ,了解delete操作符在其他情况下的工作原理。

在语言级别的数组索引像任何其他属性一样工作。

当你访问一个不在那里的属性时,proto链会一直走到find一个结果,否则返回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 不存在 ,原型被检查并且find值15

b ,因为属性1 在那里 ,属性的值( undefined )就直接返回。

此外,arrays的控制台格式化输出在环境之间通常是不同的,但这并不能真正改变实际发生的情况。