我在理解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));
我在理解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));
的in
操作測試給定的屬性名稱是否在存在對象,它不搜索值。如果存在ar[a]
,則a in ar
將成立。在你的例子中,ar[0]
存在,但ar[4]
不存在,所以a in ar
是錯誤的。
要搜索數組中的值,請使用indexOf
函數。它返回找到的元素的數組索引,或者如果找不到該值,則返回-1
。
if (ar.indexOf(a) != -1) {
console.log("in if");
}
謝謝。 我在Python中編寫了很多程序,所以我認爲它和python一樣。 – nombreellos
不是。當你寫'for(x in obj)'時,它也不一樣,它把'x'設置爲對象的屬性名稱,而不是值。 – Barmar
這是因爲in
運算符正在查找屬性名稱,而不是屬性值。
它工作正常的數組,但是你需要指定項目的指標,而不是價值:
var ar = [];
var index = 4;
var value = 5;
ar[index] = value;
if (index in ar){
console.log("in if");
}
如果使用在數組,你應該使用索引/鍵,而不是價值。 下面將有條件爲真。
例:
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");
}
想象的對象,看起來像這樣的數組:
var obj = { foo: "bar" };
var arr = ["bar"];
你會通過調用該對象上相應的鍵訪問obj
的bar
值,即
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
應該很清楚 - 有沒有在該陣列的第四個指標。希望這可以幫助。
'in'運算符測試**鍵**而不是**值**。 – Barmar
@dave數組是一個對象,它只有數字鍵。 – Barmar
javascript數組中的@dave是**對象,它不工作,因爲數組中沒有第五項(第四個索引) –