【问题标题】:In operator issue in JavaScript在 JavaScript 中的运算符问题
【发布时间】:2015-11-04 11:59:03
【问题描述】:

我在理解 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));

【问题讨论】:

标签: javascript


【解决方案1】:

in 运算符测试给定的属性名称是否存在于对象中,它不搜索值。如果ar[a] 存在,a in ar 将为真。在您的示例中,ar[0] 存在,但 ar[4] 不存在,因此 a in ar 为 false。

要在数组中搜索值,请使用indexOf 函数。它返回找到的元素的数组索引,如果找不到该值,则返回 -1

if (ar.indexOf(a) != -1) {
    console.log("in if");
}

【讨论】:

  • 谢谢。我在 python 中编写了很多程序,所以我认为它与 python 相同。
  • 不。编写for (x in obj) 时也不一样,它将x 设置为对象的属性名称,而不是值。
【解决方案2】:

这是因为in 运算符正在查找属性名称,而不是属性值。

它适用于数组,但您需要指定项目的索引,而不是值:

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

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

【讨论】:

    【解决方案3】:

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

    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 中只有一个元素,而该元素的 keyfoo,它是 value 是吧。考虑到这一点,请考虑您的数组:

    var ar = [];
    var a = 4;
    ar.push(a);
    
    0 in ar // true
    4 in ar // false
    

    正如您现在希望看到的那样,它以几乎相同的方式调查 js 对象,对于数组,in 关键字仍在寻找 key 而不是与该键对应的值.虽然 index 0 处的 value 为 4,但它的 key(或 index)仍为 0。因此,应该清楚为什么调用

    4 in ar // false
    

    返回false - 该数组的第四个索引中没有任何内容。希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      如果你在数组中使用 in,你应该使用 index/key 而不是 value。 下面将有 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");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 2015-07-04
        • 2021-10-01
        • 1970-01-01
        相关资源
        最近更新 更多