this.length >>> 0 ,这个语句经常在javascript中出现,大家有知道具体这个语句是有什么作用,已经>>>符号是一个运算符吗,还是其他什么?

2012-01-04 10:13:25 +08:00
 tomheng
8689 次点击
所在节点    问与答
8 条回复
qiao
2012-01-04 10:26:30 +08:00
位运算操作符之一,作用是向右位移一位,并用0填充。
benzhe
2012-01-04 10:51:02 +08:00
this.length >>> 0 一般用于确保this.length是可运算的数值吧
http://www.w3school.com.cn/js/pro_js_operators_bitwise.asp
1502
2012-01-04 11:27:20 +08:00
功能应该与 ~~this.length 类似吧,转为number
ambar
2012-01-04 12:15:32 +08:00
# 相见

首先,如果看到了这个用法,它可能是出现在一些库的 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.19
9.6 ToUint32 http://es5.github.com/#x9.6
11.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'
est
2012-01-04 12:15:43 +08:00
应该和 this.length||0同样的作用。
tomheng
2012-01-04 14:13:34 +08:00
tomheng
2012-01-04 14:15:01 +08:00
@est 作用不一样,this.length>>>0可以将大于等于0的数取整
est
2012-01-04 14:45:44 +08:00
@tomheng 这个学习了。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/24921

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX