中的JavaScript运行不带有一个项目的阵列

问题描述:

下面的代码片段波纹管,为什么用一个位置的数组无法正常工作工作?中的JavaScript运行不带有一个项目的阵列

您可以看到,与2项操作正常工作

  • 为什么会发生这种情况?
  • 这是什么工作?

// helper function 
 
function showResult(result) { 
 
    document.querySelector('#result').innerHTML += result+'<br/>'; 
 
} 
 

 
var a = ["1"] 
 
var b = "1" 
 

 
showResult(b in a); 
 
//false 
 

 
var a = ["1","2"] 
 
var b = "1" 
 

 
showResult(b in a); 
 
//true
<div id="result"></div>

+1

虽然我们的话题,你应该阅读有关'用[这个问题] for..in'( http://stackoverflow.com/q/500504/5743988)如果你以前没有。这是一个常见的陷阱。 – 4castle

+0

@ 4castle感谢您提出这个问题!我现在就读它! –

​​检查对象是否有键而不是值。你的第二个情况返回true,因为任何具有两个元素的数组都有键'0''1'。不要紧,'1'也恰好是该数组中的值; '1' in ['foo', 'bar']也是如此。

要测试一个元素是否在一个数组中,您应该使用Array.prototype.indexOf或在现代引擎Array.prototype.includes中。您可以使用填充工具无论从这些链接以获取所有引擎方法支持:

// Most engines (IE 9+) 
showResult(a.indexOf(b) >= 0); 

// Modern engines only: 
showResult(a.includes(b)); 
+0

谢谢你的回答!得到它了! –

+0

@AlvaroJoao不客气 – Paulpro

这不是什么in是。 in而不是用于在数组中搜索元素。它用于搜索对象密钥

实施例:

var x = {a: 1, b: 2}; 
console.log('a' in x); // true 

你的第二示例工作,因为该阵列(对象)a包含一个称为1键。

+0

感谢您的答案,然后解决方法是什么? –

+2

@AlvaroJoao'myArray.indexOf(value)> -1'会做你想做的事情 – blex

第一个结果是false,因为a没有索引1,而第二个版本的a有该索引。

in运算符不是关于确定值,而是属性(键)。

该混淆可能是因为CoffeeScript 确实为使用in来搜索值。 See here如何将它转换为indexOf