2015-11-03 63 views
2

我在理解JavaScript中的「in」運算符時遇到了小問題。 爲什麼我不能在下面的例子中去if塊?我該怎麼做?JavaScript中的運算符問題

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)); 
+0

'in'運算符測試**鍵**而不是**值**。 – Barmar

+0

@dave數組是一個對象,它只有數字鍵。 – Barmar

+0

javascript數組中的@dave是**對象,它不工作,因爲數組中沒有第五項(第四個索引) –

回答

2

in操作測試給定的屬性名稱是否在存在對象,它不搜索值。如果存在ar[a],則a in ar將成立。在你的例子中,ar[0]存在,但ar[4]不存在,所以a in ar是錯誤的。

要搜索數組中的值,請使用indexOf函數。它返回找到的元素的數組索引,或者如果找不到該值,則返回-1

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

謝謝。 我在Python中編寫了很多程序,所以我認爲它和python一樣。 – nombreellos

+0

不是。當你寫'for(x in obj)'時,它也不一樣,它把'x'設置爲對象的屬性名稱,而不是值。 – Barmar

0

這是因爲in運算符正在查找屬性名稱,而不是屬性值。

它工作正常的數組,但是你需要指定項目的指標,而不是價值:

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

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

0

如果使用在數組,你應該使用索引/鍵,而不是價值。 下面將有條件爲真。

例:

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"); 
} 
0

想象的對象,看起來像這樣的數組:

var obj = { foo: "bar" }; 
var arr = ["bar"]; 

你會通過調用該對象上相應的鍵訪問objbar值,即

obj.foo // "bar" 

這樣做的另一種方法是使用數組語法:

obj["foo"] // "bar" 

正如您所看到的,每個對象的按鍵都有一個名稱(即,富)。數組仍然是一個對象,只是它的'鍵'(或索引)是增量數值。正是如此,我們訪問通過各自的索引數組中的各種元素數組中,即:

arr[0] // "bar" 

通過這種方式,使用in關鍵字應該更加清晰。 MDN將in關鍵字定義爲以下內容:

如果指定的屬性位於指定的對象中,則in運算符返回true。

所以,在我們前面的例子一致,考慮以下因素:

"foo" in obj // true 
"bar" in obj // false 

以上是因爲,正如你已經知道,在它的可變obj只有一個元素,該元素的foo,它的是吧。考慮到這一點,考慮你的陣列:

var ar = []; 
var a = 4; 
ar.push(a); 

0 in ar // true 
4 in ar // false 

正如你現在希望看到,在大致相同的方式,調查了JS對象,數組in關鍵字仍在尋找關鍵而不是與該鍵對應的值。雖然索引0處是4,這是(或指數)仍然是0。因此,爲什麼叫

4 in ar // false 

返回false應該很清楚 - 有沒有在該陣列的第四個指標。希望這可以幫助。