# 相见
首先,如果看到了这个用法,它可能是出现在一些库的 enumerable 的函数实现中,操作对象是 *伪数组对象* 或 *数组对象* , this 就指向两种可能对象(因为 JavaScript 函数的 call 和 apply 方法,可以改变 this 的指向)。
# 运算符
“>>>” 是无符号右移运算符,它保证结果为非负整数,这正是 length 的值所想要的(如果运算子为NaN,length 结果将为0,在后续代码中遍历对象也不会抛出异常)。
详见 ES5 规范文档,文档的定义使得数组原型上的方法都能作用于伪数组上面:
MDN Array.prototype.map 实现参考:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map“Let len be ToUint32(lenValue)” :
http://es5.github.com/#x15.4.4.199.6 ToUint32
http://es5.github.com/#x9.611.7.3 The Unsigned Right Shift Operator
http://es5.github.com/#x11.7.3# 什么是伪数组对象(array-like object)?
// 能用数字下标存取,带有 length 属性
var o = {0:'foo',1:'bar',length:2}
var each = Array.prototype.forEach
// 如何简易地遍历伪数组
each.call(o,function(n,i){
console.log(n,i)
})
# 更普遍的样例
伪数组在 JavaScript 中常见的主要有两类:
// 经常会看到的做法,处理 NodeList 对象
each.call( document.querySelectorAll('div'), function(el){
doSomeThingWith(el)
})
// 又,处理 arguments 对象
var foo = function(){
return Array.prototype.join.call(arguments,',')
}
foo('yep','nope') === 'yep,nope'