为什么以下JavaScript测试显示该元素不属于该数组?

时间:2012-03-05 21:37:26

标签: javascript

代码非常简单,我希望它是真的,但它会返回false

var markets = ["AB", "CD"];
console.log("AB" in markets);

7 个答案:

答案 0 :(得分:3)

我认为你的意思是if (markets.indexOf('AB') !== -1)in基本上检查测试是否是对象的属性,而不是数组中包含的元素。

有关详细信息,请查看Array.indexOfin operator

答案 1 :(得分:1)

因为in查找属性名称,而不是值。您的属性名称是数组索引。

答案 2 :(得分:1)

来自MDN's page on the in operator

  

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

     

prop表示属性名称或数组索引的字符串或数字表达式

注意属性名称或数组索引in运算符不搜索属性值,而是搜索属性名称。在这种情况下,属性名称为01,因此0 in markets将返回true。

您应该在支持它的浏览器中使用indexOf,并在那些不支持的浏览器中使用{{3}}。

答案 3 :(得分:0)

因为in适用于对象,而不是数组。如果要可靠地执行此操作,则必须搜索数组中的每个元素:

for( var i=0, l=markets.length; i<l; i++ ){
    if( markets[i] === 'AB' ){
        // do something
    }
}

以下是可行的,这就是您的想法:

var markets = { AB: 1, CD: 1 };
console.log( "AB" in markets );

答案 4 :(得分:0)

仅在使用对象时才起作用,而不是数组。所以这将有效:

var markets = {
    AB: 'AB',
    CD: 'CD'
};

'AB' in markets; // true

答案 5 :(得分:0)

正如所说in在这种情况下不会帮助你。 我想你必须写一个搜索功能。 这是一个:

function inArray(ArrObj, Search){
  var exists = false;
  for (var i = 0; i < ArrObj.length; i++){
    if (ArrObj[i] == Search){
      return true;
      var exists = true;
      break;
    }
    else if ((i == (ArrObj.length - 1)) && (!exists)){
      if (ArrObj[i] != Search){
        return false;
      }
    }
  }
}

答案 6 :(得分:-2)

我认为你想要这样的东西,console.log(市场[0]);