2016-03-11 9 views
11

Ich bin neu bei JavaScript und es gibt eine Sache, die mich stört. Ich habe einen sehr einfachen Code bekam:Warum array.indexOf (undefined) nicht funktioniert, wenn das Array spärlich ist

var a = []; 
a[1] = 1; 

i = typeof(a[0]); 
index = a.indexOf(undefined); 
len = a.length; 

console.log(a); 
console.log("\n" + len); 
console.log("\n" + i); 
console.log("\n" + index); 

Meine Frage ist: Warum indexOf -1 zurückgibt, statt 0 Ich weiß, dass diese Methode von === vergleichen, aber ich verwendet als Parameter Schlüsselwort undefined . Wenn ich den Methodenparameter auf "undefined" ändere, funktioniert es auch nicht (aber das ist für mich offensichtlich). Kann mir jemand das erklären und sagen, was ist der einfachste Weg, einen undefinierten Wert im Array zu finden?

+0

'undefined 'ist ein Grundelement in JavaScript, also ist es eine eigene Sache, was Sie haben, ist ein leerer Index, der nicht existiert, bis Sie ihm etwas zuweisen. Wenn 'indexOf()' in einem Array nach 'undefined' sucht, sucht es tatsächlich nach diesem Wert, wenn es einen Wert für jeden unbestückten Index in einem Array zurückgibt, würde es für immer – JmJ

+0

Mögliche Duplikate von [Wie finde ich den Index eines fehlenden Wertes in einem Array?] (http: // stackoverflow.com/questions/30574147/how-to-find-the-Index eines fehlenden Wertes in einem Array) – djechlin

+0

Wie oben erwähnt, ist "undefined" ein bisschen falsch, es ist eigentlich ein spezifisches Primitiv Wert, so ist es in der Tat definiert und nicht wörtlich * nicht definiert *, was Sie erhalten, wenn Sie ein Array mit nicht gesetzten Indizes haben. – adeneo

Antwort

14

Dies wird tatsächlich einen undefined Wert in einem Array finden, das Problem ist, dass Ihr Array a keine undefined Werte enthält, also gibt es -1 zurück, was bedeutet, dass es keine gefunden hat. Ihr Array wie folgt aussieht:

[*uninitialized*, 1]

Die Tatsache, dass Sie nichts in der ersten Position setzen bedeutet nicht, es mit einem undefined bevölkert ist, wird sie einfach nicht initialisiert/ist nicht vorhanden.

Wenn Sie etwas tut wie:

var a = [undefined, 1]; 
var index = a.indexOf(undefined); 
console.log(index); 

Es wird in der Tat Druck 0 wie erwartet.

Edit: Ihre Frage zu beantworten, wie eine nicht initialisierte Wert zu finden, gehen Sie wie folgt

var a = []; 
a[1] = 1; 

for(var i = 0; i < a.length; i++){ 
    if(a[i] === undefined){ 
     console.log(i); 
    } 
} 

Dies wird den Index nicht initialisierten Array Werte drucken. Der Grund, warum dies tatsächlich funktioniert im Gegensatz zu indexOf ist, dass a[i]-undefined zu bewerten, wenn:

(1) Das Element existiert, und es hat den Wert undefined oder

(2) Das Element existiert nicht. indexOf wird jedoch diese "Lücken" im Array überspringen.

+0

Ich würde das hinzufügen, indem ich sage, wenn das Ziel des ursprünglichen Posters ist, den ersten Index zu finden, dem er noch keinen Wert zugewiesen hat, könnte er eine Schleife verwenden und auf diese Weise überprüfen – dustinroepsch

3

Im Allgemeinen Arrays in JavaScript ist spärlich - sie in ihnen Löcher haben können (Deshalb indexOf() kehrt -1), weil ein Array einfach eine Karte von Indizes auf Wert ist. Das Array von Ihnen gesuchte heißt dicht es sieht aus wie

var a = Array.apply(null, Array(3)) 

oder

var a = Array(undefined, undefined, undefined) 
a.indexOf(undefined) //0 

haben Sie einen Blick auf this Post, ich hoffe, dass es Ihnen helfen,