1

阅读此问题的答案,我了解为元素delete设置undefined值。

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

在 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只有我将它设置为未定义?

为什么会这样?

4

2 回答 2

3

当您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 ]

正在向您显示第二个数组条目丢失(它完全消失了)。

请参阅这篇文章http://perfectionkills.com/understanding-delete/,了解delete操作员在其他情况下的工作方式。

于 2013-10-06T09:09:47.803 回答
2

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

当您访问不存在的属性时,会遍历原始链,直到找到结果,或者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返回了属性()的值。

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

于 2013-10-06T09:24:30.137 回答