以下函数旨在实现IE中的indexOf
属性。如果你曾经不得不这样做,我相信你以前见过它。
if (!Array.prototype.indexOf){
Array.prototype.indexOf = function(elt, from){
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++){
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
我想知道作者在初始长度检查中使用了三个大于标志的常见情况吗?
var len = this.length >>> 0
在控制台中执行此操作只会返回我传递给它的对象的长度,而不是true或false,这让我想到了语法的目的。这是一些我不了解的高级JavaScript忍者技术吗?如果是的话,请赐教!
答案 0 :(得分:23)
来源:LINK
这是零填充右移 移动二进制的运算符 表示第一个操作数 权利的数量 由第二个操作数指定。位 向右移动被丢弃 和零添加在左侧。 你会得到一个正数 与结果相同的结果 符号传播右移算子, 但负数却失去了信号 像下一个一样变得积极 例如,(假设'a'为 -13)将返回1073741820:
代码:
result = a >>> b;
答案 1 :(得分:12)
>>>
是Zero-fill right shift运算符。 >>> 0
滥用运算符将任何数字表达式转换为“整数”或非数字表达式为零。这是它的作用:
该运算符将第一个操作数移位指定的位数 正确的。向右移位的多余位被丢弃。零 位从左侧移入。符号位变为0,所以 结果总是积极的。
Here is an explanation转换为整数的行为,适用于所有按位运算:
按位运算符将其操作数视为32位序列(零 和1),而不是十进制,十六进制或八进制数。 [...] Bitwise运算符对这种二进制文件执行操作 表示,但它们返回标准的JavaScript数值。
这些陈述一起断言expr >>> 0
将始终返回正数,如下所示:
expr
被转换为32位整数,用于按位运算>>> 0
没有效果(没有位移位)Number
以下是一些表达方式及其结果:
1 >>> 0 // 1 -- Number cast to 32-bit integer then back to Number
"1" >>> 0 // 1 -- String cast to 32-bit integer then back to Number
undefined >>> 0 // 0 -- failed cast yields zero
其他有趣的案例:
1.1 >>> 0 // 1 -- decimal portion gets it
-1 >>> 0 // 4294967295 -- -1 = 0xFFFFFFFF
// Number(0xFFFFFFFF) = 4294967295
"A" >>> 0 // 0 -- cast failed
"1e2" >>> 0 // 100 -- 1x10^2 is 100
"1e10" >>> 0 // 1410065408 -- 1x10^10 is 10000000000
// 10000000000 is 0x00000002540BE400
// 32 bits of that number is 0x540BE400
// Number(0x540BE400) is 1410065408
注意:您会注意到它们都没有返回NaN
。
答案 2 :(得分:9)
>>>
(右移)二元运算符只是将数字的最右边的位移位指定的次数,并用左边的零填充。
注意:在以下示例中,数字后面的数字表示它所在的基数.2表示二进制,10表示十进制。
例如,4 >>> 1
可以:
4(10) = 100(2)
4(10) >>> 1(10) = 010(2) = 2(10)
shift once to the right
其他例子:
4(10) >>> 2(10) = 100(2) >>> 2(10) = 001(2) = 1(10)
10(10) >>> 4(10) = 1010(2) >>> 4(10) = 0000(2) = 0(10)
15(10) >>> 1(10) = 1111(2) >>> 1(10) = 0111(2) = 7
我记得它的方法是向右移动必要的位数,然后写入数字。就像,在最后一个例子中,我只是将所有内容移到右边一次,所以结果是0111。
转移0次没有......没有。不知道为什么会这样。
答案 3 :(得分:2)