2016-08-11 42 views
0

下面的代碼片段波紋管,爲什麼用一個位置的數組無法正常工作工作?中的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感謝您提出這個問題!我現在就讀它! –

回答

3

​​檢查對象是否有鍵而不是值。你的第二個情況返回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

5

這不是什麼in是。 in而不是用於在數組中搜索元素。它用於搜索對象密鑰

實施例:

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

你的第二示例工作,因爲該陣列(對象)a包含一個稱爲1鍵。

+0

感謝您的答案,然後解決方法是什麼? –

+2

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

1

第一個結果是false,因爲a沒有索引1,而第二個版本的a有該索引。

in運算符不是關於確定值,而是屬性(鍵)。

該混淆可能是因爲CoffeeScript 確實爲使用in來搜索值。 See here如何將它轉換爲indexOf

相關問題