2012-01-09 11 views
5

yo estaba buscando en el código fuente de la biblioteca Underscore.js, específicamente para el método map (alrededor de la línea 85 en esa página, y copiado aquí):longitud de objeto negativo posible en JavaScript o underscore.js? ¿sentido?

_.map = function(obj, iterator, context) { 
    var results = []; 
    if (obj == null) return results; 
    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); 
    each(obj, function(value, index, list) { 
     results[results.length] = iterator.call(context, value, index, list); 
    }); 
    if (obj.length === +obj.length) results.length = obj.length; 
    return results; 
    }; 

completamente sencilla a excepción de la siguiente línea

if (obj.length === +obj.length) results.length = obj.length; 

Ahora, leo esto para decir "si la longitud del objeto no es un número negativo ..."
que, si mi interpretación es correcta, implica que podría ser!

Así que, queridos expertos, para qué tipo de objetos podrían

obj.length === +obj.length 

ser false? Mi comprensión de === significa que podría devolver false si el tipo de no coincidía con el tipo de +obj.length, pero aquí mi conocimiento se queda corto. ¿Qué tipo de cosas podría hacer + a los tipos de cosas que podría ser? ¿Es x === +x algún tipo de prueba idiomática genérica que simplemente no sé? ¿Es la respuesta a algún tipo de caso especial que surge más profundo en underscore.js, por ejemplo, underscore.js asigna y rastrea object.lengths negativo para algún propósito convencional? La orientación y el asesoramiento serán muy apreciados.

+2

Tenga en cuenta que '+ x' es * no * necesariamente positivo, es solo el valor numérico de' x'. Entonces, si 'var x = -10',' + x' también es '-10'. –

+0

Sí, date cuenta de que + x no hizo nada con el valor de x (no lo incrementó temporalmente para la comparación). – grantwparks

Respuesta

4

creo que es la prueba para ver si typeof obj.length === 'number'

A diferencia de si se trata de un objeto que tiene un valor de longitud de '2 days'

para que sepa si se trata de un objeto como:

var obj = { app: 'doctor', length: '45 min' }; 

vs

var obj = [ 0, 2, 1]; 
+0

Veo - Creo. Si 'obj = {app: 'doctor', length: '45 min '}' entonces 'obj.length' será' undefined', y '+ obj.Length' será' NaN'. Pero si 'obj' es una matriz, entonces su longitud será un número positivo y todo estará bien. Entonces esto es realmente una prueba de array-ness. Ahora la pregunta es "¿por qué no' obj instanceof Array'? –

+0

obj.length no estará indefinido porque hay una propiedad de longitud específica en obj y su valor es '45 min '. Pero sería desagradable usar eso como un longitud. – grantwparks

3

En javascript, el operador + también se puede usar para convertir una representación de cadena de un número en un número. Entonces la línea:

obj.length === +obj.length 

también puede significar: "la longitud es un número y no una cadena".

Cuestiones relacionadas