Javascript:删除运算符

时间:2016-02-14 22:17:29

标签: javascript arrays

我正在关注删除运算符概念的Mozilla Developers网站。在引用“删除数组元素”的页面的最后一个子部分中,显示了两个类似的脚本,但脚本的唯一区别在于它们如何修改数组。

在第一个脚本中,我完全不明白为什么“if”语句不能运行。我目前的理解是删除操作符“删除数组的元素”。如果我在控制台中键入树[3],它将在控制台中返回undefined。



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




第二个脚本似乎"模仿"删除,但不是字面意思。未定义被分配给树[3]。我对这个脚本中的“if”块如何运行没有意义,但第一个例子却没有。任何人都可以帮助我理解这种JavaScript行为吗?



var trees = ["redwood","bay","cedar","oak","maple"];
trees[3] = undefined;
if (3 in trees) {
    // this gets executed
}




4 个答案:

答案 0 :(得分:1)

在第二个示例中,密钥3仍然存在。它只是包含一个恰好未定义的值。这很令人困惑,但这只是Javascript的方式。 in运算符只检查密钥是否存在,而不是是否定义了值。

如果要在每次“删除”后输出整个数组,第一个示例将显示如下内容:

["redwood", "bay", "cedar", 4: "maple"]

虽然第二个例子会印出这样的东西:

["redwood", "bay", "cedar", undefined, "maple"]

正如您所看到的,在您的第一个示例中,密钥完全丢失,并继续使用下一个密钥,即4。在第二个示例中,密钥仍然存在,但它的值设置为undefined。

答案 1 :(得分:1)

您尝试的两种方法之间存在巨大差异:

方法1:

您正在删除,销毁,完全删除名为3的数组中的密钥tree,因此没有3 in treeif检查返回{{ 1}}。

方法2:

您要为密钥false分配一个新值,该密钥为3,仍有undefined3 in tree检查会返回if

答案 2 :(得分:0)

用户设置的undefined与未定义的javascript引擎返回的undefined之间存在差异,这意味着不存在。 javascript可以区分两者。

所以在你的例子中,当你这样做时:

var trees = ["redwood","bay","cedar","oak","maple"];
trees[3] = undefined;
if (3 in trees) {
    console.log("hi");
}

javascript可以告诉属性3存在,但是用户设置为未定义。

证明你有以下内容:

if (5 in trees) {
    console.log("hi");
}

数组的属性5从未创建过,javascript知道它未定义 缺乏创造并将其视为不存在的财产,因此不显示“hi”

答案 3 :(得分:0)

if(3 in tree) { //Stuff that won't get executed } 实际上是正确的,事实是在Javascript中的运算符不像python中那样工作,它只是检查对象是否具有属性。 javascript中的数组有一个proprety 0,就像一个字符串有一个值为someString [2]的proprety 2。 delete object [prop]之间的区别;和对象[prop] =未定义;可以通过object.hasOwnProperty(prop)看到;或迭代对象的值或道具。