利用這段代碼
color = "#"+ (Math.random()*0xffffff<<0).toString(16);
實現了隨機得到顏色
但是實在不明白為什麼?
這裡有解釋到一點 但也不明白
http://www.cnblogs.com/rubylo...
基本实现4的改进,利用左移运算符把0xffffff转化为整型。这样就不用记16777215了。由于左移运算符的优先级比不上乘号,因此随机后再左移,连Math.floor也不用了。
如果x.abcd << 0 這樣也可以得到整數 x ,那又和Math.floor(x.abcd) 有什麼差別呢?
这种问题,看规范就知道啦
移位运算在内部是啥样的?
关键就是我标红的那一步,这一步会把变量
lval
做ToInt32
的运算,而这个lval
就是来自我们移位运算的左值,就是你的999.222
。接下来,再来看看
ToInt32
做了啥:关键的那步我也给你标出来了,这里会把输入值直接取整。
所以,给一个浮点数做0的移位运算,结果就是取整。
对于
Math.floor
,规范没说具体实现,只给了一句话——Math.floor
的实现没给出,但是移位取整中间还多了好几个步骤,除了写代码的时候能稍微简洁一点以外,我觉得还是Math.floor
更好点。另外,
ToInt32
里面的那个floor
运算是这么实现的:modulo
是取模运算的意思,x
对1
取模,那就是求x
的小数部分,随后x
剪掉了自己的小数部分,那就剩下整数了嘛。必须要注意的是,
ToInt32
中是先取绝对值然后再取整的,所以在负数区间内,<< 0
和Math.floor
的结果是不一样的。Math.floor
返回的是不大于输入值的最大整数,那么肯定就有Math.floor(-1.5) = -2
。而对于
<< 0
运算,它是先取绝对值,然后取整,最后再把符号弄回去,那么就有-1.5 << 0 = -1
。