2016-07-31 6 views
0

Überprüfung für den Rückgabetyp von Prädikat

Array.prototype.takeWhile = function (predicate) { 
 
    'use strict'; 
 
    var $self = this 
 
    if (typeof predicate === 'function') { 
 
     let flagged = false, matching_count = 0, nomatching_count = 0; 
 
     for (let i = 0; i < $self.length; i++) { 
 
      let e = $self[i] 
 
      if (predicate(e)) { 
 
       if (!nomatching_count) { 
 
        matching_count++ 
 
       } else { 
 
        flagged = true 
 
        break 
 
       } 
 
      } else { 
 
       nomatching_count++ 
 
      } 
 
     } 
 
     return !flagged ? $self.slice(0, matching_count) : $self 
 
    } 
 
    throw new TypeError('predicate must be a function') 
 
}; 
 

 
var test = function() { 
 
    var array = [1, 2, 3, 4, 5]; 
 
    alert(array.takeWhile(x => x <= 3)) 
 
};
<button onclick="test()">Click me</button>

Nach der Bedingung:

if (typeof predicate === 'function') { 

} 

mag ich fragen: Wie kann den Rückgabetyp predicate überprüfen?

Ich möchte diesen Fall verhindern:

var array = [1, 2, 3, 4, 5]; 
alert(array.takeWhile(function() {})); 
+0

nicht sicher, dass dies möglich ist. Eine JavaScript-Funktion könnte bei einem Aufruf eine Zahl und bei einem anderen Aufruf eine Zeichenfolge zurückgeben. –

+0

Warum müssen Sie das verhindern? Andere Array-Methoden haben keine Überprüfung dafür. – Soviut

+0

@Soviut Die Nachricht sagt: 'Prädikat muss eine Funktion sein, während' function() {} 'eine Funktion ohne Rückgabetyp ist. –

Antwort

3

Funktionen Javascript kann alles zurückgeben, so gibt es keine Möglichkeit der Vorhersage oder deren Rückgabetyp Folgern. Die einzige Möglichkeit, den Typ der zurückgegebenen Daten zu ermitteln, besteht darin, die Funktion auszuführen und den Typ des Ergebnisses zu überprüfen.

var result = predicate(e); 
if (typeof result === 'undefined') { 
    throw 'Invalid predicate' 
} 

Beachten Sie, dass der Rückgabetyp einer Funktion undefined sein kann, das ist, was eine leere Funktion zurück.

Dies scheint jedoch unnötig, da integrierte Array-Methoden keine Überprüfung für diese Art von Rand Fall haben. Zum Beispiel [1,2,3].filter(function() {}); die Array.filter() Methode gibt ein leeres Array zurück, weil die angegebene Funktion (Prädikat) niemals Wahr im Vergleich zu irgendwelchen Elementen im Array zurückgibt.

console.log([1,2,3].filter(function() {}));

+0

Es tut mir leid. Du meinst das: ein ungültiger Fall könnte ignoriert werden, weil es nicht nötig ist (oder unnötig), das zu überprüfen, oder? Hmm .... Also, was ist das automatisch? Was ist nicht? –

+0

Ja, das Prädikat liefert immer ein Ergebnis, auch wenn es eine leere Funktion ist und "undefiniert" als "falsch" wie "falsch" und "null" betrachtet wird. Wenn also das Ergebnis des Prädikats falsch ist, dann gehe einfach weiter. – Soviut

Verwandte Themen