摘自:es5-safe.js
// ES5 15.4.4.18
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/foreach
AP.forEach || (AP.forEach = function(fn, context) {
for (var i = 0, len = this.length >>> 0; i < len; i++) {
if (i in this) {
fn.call(context, this[i], i, this);
}
}
});
this.length >>> 0
此句解释:这个语句先将 array 的 length 属性存在局部变量 len 中加速访问。然后借助右移位运算符 用零填充 len 左边空出的位,这样做的好处是如果 length 未定义就取0.
语法解释:
result = expression1 >>> expression2
>>> 运算符将 expression1 的位右移 expression2 中指定的位数。 用零填充右移后左边空出的位。 右移的位被丢弃。
这个可以看ECMAScript的相关章节,可以用来将:
1. 所有非数值转化成0,例如undefined
2. 所有大于等于0等数取整数部分
'string' >>> 0 //==>0
null >>> 0 //==>0
undefined >>> 0 //==>0
34.23 >>> 0 //==>0
[] >>> 0 //==>0
这么写确实比 var len = this.length || 0; (parseInt?)要好很多,在遇到意外的 this 时,它不会返回 { }、NaN 等意外的值。(IE 6+ 支持)
参考:http://www.zhihu.com/question/20693429
http://javascript.about.com/od/hintsandtips/a/foreach.htm