Es handelt sich um jede Methode
代码如下: var each = _.each = _.forEach = function(obj, iterator, context) { if (obj == null) return; if (nativeForEach && obj.forEach === nativeForEach) { obj.forEach(iterator, context); } else if (obj.length === +obj.length) { for (var i = 0, l = obj.length; i < l; i++) { if (iterator.call(context, obj[i], i, obj) === breaker) return; } } else { for (var key in obj) { if (_.has(obj, key)) { if (iterator.call(context, obj[key], key, obj) === breaker) return; } } } };
In dieser Methode gibt es einen Satz:
if (obj.length === +obj.length)
Dieser Satz entspricht
if (typeof obj.length === 'number')
, der verwendet wird Elemente beurteilen Ob es sich um einen numerischen Typ handelt. typeof und Object.prototype.toString sind gängige Schreibweisen. Letzteres ist ungewöhnlich und für den Normalbürger schwer zu verstehen.
Einige Bibliotheken verfügen über Toolfunktionen zur Typbeurteilung, wie z. B.
代码如下: function isNumber1(a){ return typeof a === 'number' }
oder verwenden Sie Object.prototype.toString
代码如下: function isNumber2(a) { return Object.prototype.toString.call(a) === '[object Number]' }
, um es dahingehend zu ändern Schreibweise
代码如下: function isNumber3(a){ return a === +a }
Getestet mit verschiedenen Typen
代码如下: var arr = ['1', true, false, undefined, null, {}, [], 1] for (var i=0; i<arr.length; i++) { console.log(isNumber3(arr[i])) }
Das Ergebnis ist, dass nur das letzte Element im Array wahr ist. Das heißt, nur der numerische Typ a === +a ist wahr.
Warum nicht typeof verwenden? Weil der String-Vergleich theoretisch alle Zeichen durchlaufen muss und die Leistung direkt proportional zur Länge des Strings ist.