2016-08-09 137 views
3

Ich habe eine js-Lib geschrieben, die in ie8 arbeiten muss und ich wurde gebeten, jQuery nicht als Teil der Implementierung zu verwenden. Ein Teil der js lib erfordert das Durchsuchen eines Arrays nach einem passenden Wert. Moderne Browser unterstützen die Array indexOf() - Funktion, die dies erreicht. Da meine js lib ie8 jedoch unterstützen muss, kann ich diese Funktion nicht verwenden. Anfangs schrieb ich die folgende benutzerdefinierte Funktion:js Array-Suchfunktion für ie8

function inArray(anArray, aValue) 
{ 
    for (var i = 0; i < anArray.length; i++) 
     if (anArray[i] === aValue) return true; 

    //value was not in array 
    return false; 
} 

jedoch heute Morgen es fiel mir ein, dass es besser wäre, diese mit prototypische Vererbung zu schreiben. Was wäre eine gute Möglichkeit, dies anhand der prototypischen Vererbung neu zu schreiben? Gibt es auch eine Möglichkeit, den direkten Quellcode für den ES-Standard zu verwenden, die indexOf() -Funktion zu kopieren und in meine benutzerdefinierte js-Bibliothek einzufügen? Nicht sicher, ob das möglich ist oder nicht, aber es scheint eine gute Möglichkeit zu sein, Snippets zu portieren, ohne das Rad neu zu erfinden.

+0

Bessere Verwendung von Polyfills – Maxx

+0

@Maxx: Polyfilling Array-Methoden auf IE8 ist problematisch: Sie können die Methoden nicht aufzählbar machen. –

Antwort

1

Sie sind wahrscheinlich am besten mit einer Dienstprogrammfunktion, die Sie das Array in, wie die inArray in Ihrer Frage übergeben.

Sie konnte eine Shim für Array#indexOf oder includes oder ähnlich wie Array.prototype, fügen aber wenn man es täte, würde es enumerable werden und in for-in Schleifen auftauchen. Leute sollten nichtfor-in verwenden, um Arrays zu durchlaufen, aber leider tun sie manchmal. Wenn sie in Ihrer Codebasis oder in einer anderen Bibliothek, die Ihre Codebasis enthält, enthalten sind, wird das ein Problem darstellen.

Leider können Sie es nicht aufzählbar machen, da IE8 Object.defineProperty nicht unterstützt (außer auf HTML-Elementen, seltsamerweise).

+0

['Array enthält" Polyfill] (https: //developer.mozilla. org/de-DE/docs/Web/JavaScript/Referenz/Global_Objects/Array/includes # Polyfill) – Oriol

1

Als allgemeine Regel gilt, Ihren eigenen Namensraum und unter Verwendung einer Funktion, wie Sie beschrieben haben, ist wahrscheinlich besser für eine Bibliothek, etwa so:

MyLib.inArray = function(array, value) { 
    // implementation here 
}; 

Sie den Prototyp Array ändern könnte mit der ES6 Funktion .includes() wie so:

Array.prototype.includes = Array.prototype.includes || function(needle) { 
    // implementation here 
}; 

und dann können Sie es wie so verwenden:

[1, 2, 3].includes(3); // true 

(Beachten Sie, dass, wenn es bereits vorhanden ist, wir es nicht außer Kraft setzen)

Dies ist jedoch im Allgemeinen schlechte Praxis in einer Bibliothek, zu tun, weil Sie einen Verweis auf ein Build sind Modifizieren -in Funktion, auf die sich andere Skripte auf der Seite verlassen können! Außerdem werden Eigenschaften, die auf diese Weise hinzugefügt wurden, angezeigt, wenn das Array mit for..in wiederholt wird, was äußerst unerwünscht ist.

+1

Ja, das Hinzufügen einer aufzählbaren Eigenschaft zu "Array.prototype" ist fast immer eine schlechte Idee. –

+0

danke für die Eingabe Ich würde dies als eine Antwort zu markieren, aber leider so wird nur dem Fragesteller erlauben, eine einzige Antwort als Antwort zu markieren – user6604655