我正在关注删除运算符概念的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
}

答案 0 :(得分:1)
在第二个示例中,密钥3
仍然存在。它只是包含一个恰好未定义的值。这很令人困惑,但这只是Javascript的方式。
in运算符只检查密钥是否存在,而不是是否定义了值。
如果要在每次“删除”后输出整个数组,第一个示例将显示如下内容:
["redwood", "bay", "cedar", 4: "maple"]
虽然第二个例子会印出这样的东西:
["redwood", "bay", "cedar", undefined, "maple"]
正如您所看到的,在您的第一个示例中,密钥完全丢失,并继续使用下一个密钥,即4。在第二个示例中,密钥仍然存在,但它的值设置为undefined。
答案 1 :(得分:1)
您尝试的两种方法之间存在巨大差异:
您正在删除,销毁,完全删除名为3
的数组中的密钥tree
,因此没有3 in tree
,if
检查返回{{ 1}}。
您要为密钥false
分配一个新值,该密钥为3
,仍有undefined
,3 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)看到;或迭代对象的值或道具。