在哈希对象上调用 forEach
Calling forEach on a hash object
所以,这有效(至少在 chrome 中(:
var foo = {
0: 'a',
1: 'b',
2: 'c'
};
//add a non-enumerable length property
Object.defineProperty(foo, 'length', {value: 3});
[].forEach.call(foo, function(val){console.log(val);}); //logs a b c
如果键是数字字符串而不是整数,它甚至可以工作,只要有一个长度属性。但是,如果键是非数字字符串,则会以静默方式失败。如果某些键是数字键,而某些键或非数字键适用于数字键,而在其他键上静默失败。所以我的问题是双重的。首先,为什么我不能用非数字字符串来做到这一点(底层实现是否使用递增for
循环?为什么它足够聪明,可以对键进行类型强制?(
我的意思是,javascript没有真正的数组,对吧?它们只是以整数作为键的哈希表查找?因此,尽管我意识到我在这里将语言拉伸到临界点,但为什么不能实现/黑客攻击以适当的多态方式运行呢?
第二个问题是,如果这不应该/不能工作,谁认为让它默默失败是个好主意?为什么这不会引发错误?
它仅适用于 0
和 length
之间的整数键,因为Array.prototype.forEach
应该与类似数组的对象一起使用。
基础实现是否使用递增 for 循环?
或多或少。它的行为在 ES5 第 15.4.4.18 节中定义:
- 让
O
是调用ToObject
传递 this 值作为参数的结果。- 让我们
lenValue
调用[[Get]]
内部方法的结果,O
参数为"length
"。len
ToUint32(lenValue)
.- 如果
IsCallable(callbackfn)
false
,则抛出TypeError
异常。- 如果
thisArg
被提供,就T
thisArg
;否则就T
undefined
。- 让
k
0
.- 重复,同时
k < len
- 让
Pk
ToString(k)
.- 让我们
kPresent
调用带有参数Pk
的O
的[[HasProperty]]
内部方法的结果。- 如果
kPresent
true
,则
- 让我们
kValue
调用带有参数Pk
的O
的[[Get]]
内部方法的结果。- 调用
[[Call]]
的内部方法callbackfn
,T
作为包含kValue
、k
和O
的this
值和参数列表。k
增加1
。- 返回
undefined
.
为什么它适用于非数组对象?
它的行为是这样的设计:
forEach
函数是有意泛型的;它不需要 它的这个值是一个数组对象。因此它可以是 转移到其他类型的对象以用作方法。是否forEach
函数可以成功应用于主机对象是 依赖于实现。
为什么不为非数字属性调用callbackfn
?
对于非数值属性,它"失败"forEach
因为只是一个数组方法,其目的是迭代类似数组的对象。如果要迭代对象的所有属性,则应使用 for...in
循环。
- 复选框:使用Array.prototype.forEach调用推送选中订单,
- 在forEach内部进行异步调用
- 使用Canvas和ForEach处理异步调用
- 不能调用未定义节点.js的方法“forEach”
- 我可以使用 foreach 循环来发送 ajax 调用的响应吗?
- Knockout.js:在原型上调用函数,但保留在foreach的上下文中
- 在forEach中调用类函数:Javascript如何处理“this”关键字
- PHP foreach 循环和每个循环的一个 AJAX 调用
- 在 razor foreach 语句中调用 JS 函数
- 在哈希对象上调用 forEach
- Array.prototype.forEach.call 给出 TypeError: 非法调用
- 使用 setTimeout 调用一次 forEach 的回调函数即可完成
- MongoDB aggregate() - 错误“TypeError: 无法调用未定义的方法'forEach
- 在 async.each 的帮助下调用 foreach 中的同步函数(带回调)
- [].forEach调用jquery中的备选方案
- RangeError:使用Array.forEach超出了最大调用堆栈大小
- 在foreach循环中多次调用Javascript函数
- 未调用绑定到foreach中单击操作的函数
- 在Foreach循环中调用Async方法
- 为什么不能在nodeList上调用forEach