[] 是一个数组。
这个数组根本不用。
它被放在页面上,因为使用数组可以让您访问数组原型,例如.forEach。
这比输入Array.prototype.forEach.call(...); 快
接下来,forEach 是一个将函数作为输入的函数...
[1,2,3].forEach(function (num) { console.log(num); });
...对于this 中的每个元素(其中this 类似于数组,因为它有一个length 并且您可以像this[1] 一样访问它的部分)它将传递三件事:
- 数组中的元素
- 元素的索引(第三个元素将通过
2)
- 对数组的引用
最后,.call 是函数具有的原型(它是一个在其他函数上调用的函数)。
.call 将采用它的第一个参数并将常规函数内部的 this 替换为您所需要的任何内容传递call,作为第一个参数(undefined 或null 将在日常JS 中使用window,或者将是您传递的任何内容,如果在“严格模式”下)。其余参数将传递给原始函数。
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
// 0: "a"
// 1: "b"
// 2: "c"
因此,您正在创建一种快速调用forEach 函数的方法,并且您正在将this 从空数组更改为所有<a> 标记的列表,并且对于每个<a> in-命令,你正在调用提供的函数。
编辑
逻辑结论/清理
下面有一篇文章的链接,该链接建议我们放弃对函数式编程的尝试,并且每次都坚持手动的内联循环,因为这种解决方案是 hack-ish 且难看。
我想说,虽然 .forEach 的帮助不如其对应的 .map(transformer)、.filter(predicate)、.reduce(combiner, initialValue),但当您真正想做的只是修改外部世界(而不是数组),n 次,同时可以访问 arr[i] 或 i。
那么我们如何处理这种差异,因为 Motto 显然是一个有才华和知识渊博的人,我想想象我知道我在做什么/我要去哪里(不时...... ..其他时候是头脑先学习)?
答案实际上很简单,由于疏忽,鲍勃叔叔和克罗克福德爵士都会面对:
清理它。
function toArray (arrLike) { // or asArray(), or array(), or *whatever*
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
现在,如果您质疑自己是否需要这样做,答案很可能是否定的......
这个确切的事情是由... ...现在每个(?)具有高阶功能的库完成的。
如果您使用 lodash 或 underscore 甚至 jQuery,它们都会有一种方法来获取一组元素,并执行 n 次操作。
如果你不使用这样的东西,那么一定要自己写。
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);
};
ES6(ES2015) 及更高版本的更新
slice( )/array( )/etc 辅助方法不仅可以让那些想要像使用数组一样使用列表的人生活更轻松(因为他们应该),但对于那些拥有奢侈的人来说在不久的将来在 ES6+ 浏览器中运行,或者在今天的 Babel 中“转译”,你有内置的语言特性,这使得这种类型的事情变得不必要。
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 ];
超级干净,非常有用。
查找 Rest 和 Spread 运算符;在 BabelJS 网站上试用它们;如果您的技术栈井井有条,请通过 Babel 和构建步骤在生产环境中使用它们。
没有充分的理由不能使用从非数组到数组的转换... ...只是不要弄乱你的代码什么都不做但是粘贴相同丑陋的线条,无处不在。