[]
es una matriz
Esta matriz no se usa en absoluto.
Se está poniendo en la página, porque el uso de una matriz le da acceso a prototipos de matriz, como .forEach
.
Esto es más rápido que escribir Array.prototype.forEach.call(...);
A continuación, forEach
hay una función que toma una función como entrada ...
[1,2,3].forEach(function (num) { console.log(num); });
... y para cada elemento en this
(donde this
es como una matriz, en el sentido de que tiene un length
y puede acceder a sus partes como this[1]
) pasará tres cosas:
- el elemento en la matriz
- el índice del elemento (pasaría el tercer elemento
2
)
- una referencia a la matriz
Por último, .call
es un prototipo que tienen funciones (es una función que se llama a otras funciones).
.call
tomará su primer argumento y lo reemplazará this
dentro de la función regular con lo que haya pasado call
, como primer argumento ( undefined
o null
lo usará window
en JS cotidiano, o será lo que haya pasado, si está en "modo estricto"). El resto de los argumentos se pasarán a la función original.
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
// 0: "a"
// 1: "b"
// 2: "c"
Por lo tanto, está creando una forma rápida de llamar a la forEach
función, y está cambiando this
de la matriz vacía a una lista de todas las <a>
etiquetas, y para cada <a>
orden, está llamando a la función proporcionada.
EDITAR
Conclusión lógica / limpieza
A continuación, hay un enlace a un artículo que sugiere que descartemos los intentos de programación funcional y nos apeguemos al bucle manual, en línea, siempre, porque esta solución es hack-ish y antiestética.
Yo diría que, si bien .forEach
es menos útil que sus homólogos, .map(transformer)
, .filter(predicate)
, .reduce(combiner, initialValue)
, todavía sirve los propósitos cuando todo lo que realmente quiere hacer es modificar el mundo exterior (no la matriz), n-veces, mientras que tener acceso a cualquiera arr[i]
o i
.
Entonces, ¿cómo lidiamos con la disparidad, ya que Motto es claramente un tipo talentoso y conocedor, y me gustaría imaginar que sé lo que estoy haciendo / a dónde voy (de vez en cuando ... ... otro veces es el aprendizaje de cabeza)?
La respuesta es en realidad bastante simple, y algo que tío Bob y Sir Crockford se enfrentarían a ambos, debido a la supervisión:
limpiarlo .
function toArray (arrLike) { // or asArray(), or array(), or *whatever*
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
Ahora, si se pregunta si necesita hacer esto, usted mismo, la respuesta puede ser no ...
Esto es exactamente lo que hacen ... ... todas las (?) Bibliotecas con características de orden superior en estos días.
Si está usando lodash o subrayado o incluso jQuery, todos tendrán una forma de tomar un conjunto de elementos y realizar una acción n veces.
Si no estás usando algo así, entonces, por supuesto, escribe el tuyo.
lib.array = (arrLike, start, end) => [].slice.call(arrLike, start, end);
lib.extend = function (subject) {
var others = lib.array(arguments, 1);
return others.reduce(appendKeys, subject);
};
Actualización para ES6 (ES2015) y más allá
No solo un método auxiliar slice( )
/ array( )
/ etc facilitará la vida de las personas que desean usar listas tal como usan las matrices (como deberían), sino también para las personas que tienen el lujo de operar en navegadores ES6 + de usuarios relativamente cercanos. futuro, o de "transpilar" en Babel hoy, tiene características de lenguaje incorporadas, que hacen innecesario este tipo de cosas.
function countArgs (...allArgs) {
return allArgs.length;
}
function logArgs (...allArgs) {
return allArgs.forEach(arg => console.log(arg));
}
function extend (subject, ...others) { /* return ... */ }
var nodeArray = [ ...nodeList1, ...nodeList2 ];
Súper limpio y muy útil.
Busque los operadores Rest and Spread ; pruébelos en el sitio de BabelJS; Si su pila tecnológica está en orden, úsela en producción con Babel y un paso de compilación.
No hay una buena razón para no poder usar la transformación de no matriz a matriz ... ... simplemente no ensucie su código haciendo nada más que pegar esa misma línea fea, en todas partes.