【问题标题】:Why does javascript's "in" operator return true when testing if 0 exists in an array that doesn't contain 0?为什么javascript的“in”运算符在测试不包含0的数组中是否存在0时返回true?
【发布时间】:2011-03-05 06:27:55
【问题描述】:

为什么 Javascript 中的“in”运算符在测试数组中是否存在“0”时返回 true,即使数组似乎不包含“0”?

例如,这返回 true,并且有意义:

var x = [1,2];
1 in x; // true

这返回 false,并且有意义:

var x = [1,2];
3 in x; // false

但是这返回 true,我不明白为什么:

var x = [1,2];
0 in x;

【问题讨论】:

  • 这个逻辑在python中有效,在javascript中有效

标签: javascript arrays in-operator


【解决方案1】:

它指的是索引或键,而不是值。 01 是该数组的有效索引。还有有效的密钥,包括"length""toString"。试试2 in x。这将是错误的(因为 JavaScript 数组是 0 索引的)。

请参阅MDN documentation

【讨论】:

    【解决方案2】:

    in 运算符不会按照您的想法执行。如果指定的操作数是对象的属性,in 运算符将返回 true。对于数组,如果操作数是有效的index,它返回true(如果将数组视为一个特殊情况的对象,其中属性被简单地命名为0、1、2、.. .)

    例如,试试这个:

    var x=[1,4,6];
    alert(2 in x);
    

    它还会返回true,因为“2”是数组的有效索引。同理,“0”是数组的索引,所以也返回true

    【讨论】:

    • "(如果将数组视为一个特殊情况的对象,其中属性被简单地命名为 0、1、2,......" 这就是它们是,根据规范。当然,JavaScript 引擎会尽可能优化它们。:-)
    【解决方案3】:

    Javascript 的in 运算符不检查值是否包含在数组中。它检查对象是否具有属性或索引。所以var x = [4,5]; 4 in x; //false 1 in x; //true

    因为长度是x的一个属性,"length" in x; //true

    【讨论】:

      【解决方案4】:

      现代浏览器,除了 IE,支持几种可以找到值的方法 在一个数组中。

      indexOf 和 lastIndexOf 返回精确匹配的第一个(或最后一个)索引 他们的参数在一个数组中,或者 -1,如果没有找到匹配的元素。

      if(A.indexOf(0)!= -1){
          // the array contains an element with the value 0.
      }
      

      您可以向 IE 和旧版浏览器添加一种或两种方法-

      if(![].indexOf){
          Array.prototype.indexOf= function(what, i){
              i= i || 0;
              var L= this.length;
              while(i< L){
                  if(this[i]=== what) return i;
                  ++i;
              }
              return -1;
          }
          Array.prototype.lastIndexOf= function(what, i){
              var L= this.length;
              i= i || L-1;
              if(isNaN(i) || i>= L) i= L-1;
              else if(i< 0) i += L;
              while(i> -1){
                  if(this[i]=== what) return i;
                  --i;
              }
              return -1;
          }
      }
      

      【讨论】:

      • 感谢您提供解决问题的方法,而不仅仅是解释为什么它不起作用。
      【解决方案5】:

      我猜你之前用过 Python,在 JS 中用 Array.prototype.includes

      let x = [1, 2]
      x.includes(1) // true
      

      in 运算符检查数组的索引而不是值

      0 in [1, 2] // true
      2 in [1, 2] // false
      

      【讨论】:

        【解决方案6】:

        就像迭代对象属性的 js for in 循环一样,in 运算符检查指定属性是否在指定对象或其 prototype 链中。它不检查 element 是否在数组中。

        假设 x 是一个 数组,使用 x.includes(element) 在 nodejs/modern-browsers 中返回 true/false。至于loop,使用for(let element of x),因为x是一个js iterable

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-21
          • 2021-04-28
          • 2014-09-25
          • 1970-01-01
          • 1970-01-01
          • 2014-12-18
          • 2011-05-04
          • 1970-01-01
          相关资源
          最近更新 更多