array.forEach.call vs array.map.call
array.forEach.call vs array.map.call
要在 JavaScript 中循环访问querySelectorAll
的结果,以下其中一个是否比另一个更可取?
[].forEach.call(document.querySelectorAll('div'){
// do something
})
[].map.call(document.querySelectorAll('div'){
// do something
})
从本质上讲,我想知道这些是否都实现了相同的结果,即提供对从querySelectorAll
返回的每个 dom 元素的访问。如果是这样,人们可能想要使用一个而不是另一个的原因是什么?
forEach 对原始数组元素进行操作。(如果你只想迭代所有元素,你应该使用 forEach(
map 正在数组中运行,对每个元素应用一个函数,并将结果作为新数组发出。(如果你想对每个元素应用一些更改,你应该使用map(
元素
将在 map
和 forEach
之间循环存在细微差异。如果数组中的元素是undefined
的,它不会在map
中被调用,但它会在forEach
被调用。
显然,这种区分不适用于querySelectorAll
,它的结果永远不会返回undefined
。
因此,它们之间的唯一区别是函数返回的内容。 forEach
没有返回值。 map
数组的每个成员上执行一个函数并返回结果。因此,例如,您可以这样做:
var values = [].map.call(document.querySelectorAll('input'), function(el) {
return el.value;
});
这将返回一个数组,其中包含 querySelectorAll('input')
选择的每个元素的value
。
因此,当这是您想要的时,您应该使用map
;否则,请使用forEach
。
注意,Array.prototype.every
和Array.prototype.some
也存在;有时它们可能更合适。
forEach - 仅迭代数组元素。
map - 迭代数组元素并返回一个新数组。
例如..var temp = [].map.call(document.querySelectorAll('div'), function(e){
return e.id;
// do something
})
temp 是具有所有div 元素 id 的新数组;
相关文章:
- 为什么要将Array.prototype.slice.call与参数一起使用
- Array.prototype.stice.call()的内部工作
- Array.prototype.splice.call-不适用于querySelectorAll('.class
- Array.prototype.slice.call如何在getElementsByClassName的重新创建中工作
- 为什么使用Array.prototype.map.call而不是Array.map.call
- the meaning of jQuery javascript: Array.prototype.slice.call
- 为什么我不能在 Array.isArray 上成功使用“call”
- TypeError: 属性 Array.prototype.splice.call(..) 是不可配置的,无法删除
- [].map.call() VS Array.prototype.map.call()?
- 为什么我不能用 Array.join.call 代替 Array.prototype.join.call
- Array.prototype.forEach.call 给出 TypeError: 非法调用
- 我无法理解Array.prootype.slice.call
- [].slice.call(this) vs array.prototype.call(this)
- 处理 Array.prototype.slice.call(参数)的更简洁方法
- array.forEach.call vs array.map.call
- Array.prototype.join.call 在后台对字符串做什么
- Array.prototype.unshift.call(arguments,…)是如何做到的
- 为什么调用array.prototype. foreach .call()时将数组设置为THIS对象不能工作?
- js:为什么用Array.prototype.map.call代替map() ?
- Array.Call(o)对原型继承做了什么?