[]
é uma matriz.
Essa matriz não é usada.
Está sendo colocado na página, porque o uso de uma matriz fornece acesso a protótipos de matriz, como .forEach
.
Isso é apenas mais rápido do que digitar Array.prototype.forEach.call(...);
Em seguida, forEach
é uma função que assume uma função como entrada ...
[1,2,3].forEach(function (num) { console.log(num); });
... e para cada elemento em this
(onde this
é do tipo matriz, na medida em que possui um length
e você pode acessar suas partes como this[1]
), ele passa três coisas:
- o elemento na matriz
- o índice do elemento (o terceiro elemento passaria
2
)
- uma referência à matriz
Por fim, .call
é um protótipo que possui funções (é uma função que é chamada em outras funções).
.call
pegará seu primeiro argumento e substituirá this
dentro da função regular o que você passou call
, como o primeiro argumento ( undefined
ou null
será usado window
no JS diário, ou será o que você passou, se estiver no "modo estrito"). O restante dos argumentos será passado para a função original.
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
// 0: "a"
// 1: "b"
// 2: "c"
Portanto, você está criando uma maneira rápida de chamar a forEach
função e está mudando this
da matriz vazia para uma lista de todas as <a>
tags e, para cada <a>
ordem, está chamando a função fornecida.
EDITAR
Conclusão Lógica / Limpeza
Abaixo, há um link para um artigo sugerindo que descartemos as tentativas de programação funcional, e seguimos o loop inline manual todas as vezes, porque essa solução é um hack-ish e desagradável.
Eu diria que, enquanto .forEach
é menos útil do que suas contrapartes, .map(transformer)
, .filter(predicate)
, .reduce(combiner, initialValue)
, ainda serve a propósitos quando tudo que você realmente quer fazer é modificar o mundo exterior (não a matriz), N-vezes, ao ter acesso a qualquer arr[i]
ou i
.
Então, como lidamos com a disparidade, já que o Lema é claramente um cara talentoso e experiente, e eu gostaria de imaginar que sei o que estou fazendo / para onde estou indo (de vez em quando ... vezes que é o primeiro aprendizado)?
A resposta é realmente bastante simples, e algo que o tio Bob e Sir Crockford enfrentariam, devido à supervisão:
limpe-o .
function toArray (arrLike) { // or asArray(), or array(), or *whatever*
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
Agora, se você está questionando se precisa fazer isso, você mesmo, a resposta pode não ser ...
exatamente isso é feito por ... ... todas as bibliotecas (?) Com recursos de ordem superior atualmente.
Se você estiver usando lodash, sublinhado ou até jQuery, todos terão uma maneira de pegar um conjunto de elementos e executar uma ação n vezes.
Se você não estiver usando uma coisa dessas, escreva por conta própria.
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);
};
Atualização para ES6 (ES2015) e além
Não apenas o método auxiliar slice( )
/ array( )
/ etc facilitará a vida das pessoas que desejam usar as listas da mesma forma que usam matrizes (como deveriam), mas também para as pessoas que têm o luxo de operar nos navegadores ES6 + dos relativamente próximos. No futuro, ou de "transpilar" hoje em Babel, você tem recursos de linguagem incorporados, que tornam esse tipo de coisa desnecessário.
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 ];
Super limpo e muito útil.
Procure os operadores Descansar e Espalhar ; experimentá-los no site BabelJS; se sua pilha de tecnologia estiver em ordem, use-a em produção com Babel e uma etapa de construção.
Não há uma boa razão para não poder usar a transformação de não array em array ... ... apenas não bagunce seu código sem fazer nada além de colar a mesma linha feia em todos os lugares.