JavaScript中的In运算符问题

3

我在理解JavaScript中的"in"运算符时遇到了一些小问题。为什么我不能进入下面示例中的if块?我该如何做呢?

var ar = [];
var a = 4;
ar.push(a);

if (a in ar){
    console.log("in if");
}

console.log(ar);
console.log(a);
console.log(typeof(ar[0]));
console.log(typeof(a));

1
in 运算符测试 而不是 - Barmar
@dave 数组是一个对象,只不过它的键是数字。 - Barmar
@dave 在 JavaScript 中,数组本质上是对象。它无法正常工作的原因是数组中没有第五个项目(第四个索引)。 - jonny
4个回答

6
in 运算符用于测试对象中是否存在给定的属性名,它不会搜索值。如果 ar[a] 存在,则 a in ar 将返回 true。在您的示例中,ar[0] 存在,但 ar[4] 不存在,因此 a in ar 为 false。
要在数组中搜索值,请使用 indexOf 函数。它返回找到的元素的数组索引,如果找不到该值,则返回 -1
if (ar.indexOf(a) != -1) {
    console.log("in if");
}

1
谢谢。我在Python中编程很多,所以我认为它和Python一样。 - nombreellos
不是的。当你写for (x in obj)时,它设置x为对象的属性名称,而不是值。 - Barmar

0
如果您正在使用Array,应该使用索引/键而不是值。 以下将具有if条件为真。
例如:
var ar = [];
var a = 4;
ar.push(a);
if(0 in ar){
  console.log("in if");
}

您可以在使用对象时使用属性名称。 例如:
var student = {name: "John", lastName: "Cena", age: 30};
if(name in student){
  console.log("in if");
}

0

想象一个看起来像这样的对象和数组:

var obj = { foo: "bar" };
var arr = ["bar"];

你可以通过在对象上调用相应的键来访问objbar值,例如:

obj.foo // "bar"

另一种做法是使用数组语法:

obj["foo"] // "bar"

正如您所看到的,每个对象的键都有一个名称(即foo)。数组仍然是一个对象,只是它的“键”(或索引)是递增的数字值。因此,我们使用数组中各自的索引来访问数组中的各个元素,例如:

arr[0] // "bar"

以这种方式使用in关键字应该更加清晰。MDN将in关键字定义如下:

如果指定的属性在指定的对象中,则in运算符返回true。

因此,根据我们之前的示例,考虑以下情况:
"foo" in obj // true
"bar" in obj // false

以上情况发生的原因是,正如您已经知道的那样,变量obj只有一个元素,该元素的foo,它的是bar。考虑一下您的数组:
var ar = [];
var a = 4;
ar.push(a);

0 in ar // true
4 in ar // false

如你现在所见,就像它对js对象进行的调查一样,在数组中,in关键字仍然寻找而不是与该键对应的值。虽然索引0处的为4,但其(或索引)仍然是0。因此,应该清楚为什么要调用...

4 in ar // false

返回 false - 该数组的第四个索引中没有任何内容。希望这可以帮到你。

0

这是因为in运算符寻找的是属性名,而不是属性值。

对于数组来说它可以正常工作,但你需要指定项的索引,而不是值:

var ar = [];
var index = 4;
var value = 5;
ar[index] = value;

if (index in ar){
    console.log("in if");
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接