Open lishengzxc opened 8 years ago
习惯用 ~~
取整
恩 两次按位非 负负得正
常用的~~ array = [myVar]; // to array
http://www.basecss.net/2014/03/27/code-learning/ by @basecss
*2: 41.327ms <<1: 28.248ms 我的是chrome 50,结果是这样,多次执行偶有移位比直接乘慢的情况
@lsycxyj 嗯,确实有,其实我觉得对于简单本身可以用直接运算的比必要用位运算,但是我们没有必要排斥它。
上面的一段文字来源于一篇比较老的博文http://www.ruanyifeng.com/blog/2010/01/12_javascript_syntax_structures_you_should_not_use.html。说的并没太错,但是却没有告诉我们到底会降低多少速度,“"按位与运算符"
&
同"逻辑与运算符"&&
,很容易混淆”,真的容易混淆吗?(博主是自己很钦佩的一个前辈,自己接下来主要是想分享一些 JS 可能不常用的技巧(理解了以后就常用了:p))到底会慢多少?
先拿一个位运算左移
<<
等效*2
的例子,别吐槽这么去测试有什么意义,自己真的写代码的时候基本没人会去使用位移操作。来,打开 Console 看例子: http://lishengzxc.github.io/bblog/Bitwise-Shift.html结果:我的浏览器是 Chrome,MBP15(13年),发现循环10000000次也仅相差不到 5ms。而且你发现多刷新一次,发现直接整数乘法或除法和左移右移谁快谁慢是不确定的,反正相差无几。
再来看一个取整的例子:http://lishengzxc.github.io/bblog/Bitwise-GetInt.html
这是一个
Number
的取整的例子,而不是String
转Number
结果:我们发现这个时候按位或
|
要快于其他 API,除了这点外,大家在注意下parseInt()
,可以发现,不带第二个参数很重要,首先明确是了是十进制同时速度也快了不少。不过,虽然按位或
|
让Number
的取整加速不少,但是它只适用于Number
,String
还是老老实实的吧,比如:JS 使用二进制位运算的一些例子
我举得例子肯定不全,欢迎大家头脑风暴~
a & b
a \| b
a ^ b
~ a
a << b
a >> b
a >>> b
随机获取数组某项
随机获取某项关键是随机拿到满足数组长度的索引
是不是简洁了许多?
让
indexOf()
返回true
orfalse
补充:ES6/7 和
indexOf()
类似的 API切换变量 0 或 1
碰撞检测优化(标示我需不要和你检测碰撞)
如果已经对 A 测试了 B,就没有必要再对 B 测试 A。我们需要维护一个二维数组保存每个碰撞对象的2个标志
impactFlag
和impactFlags
其实 *inux 的权限系统 7 = 1 + 2 + 4 也是这么设计的。
将权限值和 1、2、4 按位与
&
,就能得出目标用户对目标文件有什么权限了。left-pad
https://www.npmjs.com/package/left-pad
最新的
left-pad
,因为@左耳朵耗子的 PR 源码已经更改了。以前的版本中,补 n 位字符,字符串链接时间复杂度是 O(n) 的,字符串需要执行 n 次的链接操作,那可以降低时间复杂度吗?
这里用了2个位运算,
&
和>>
,其实算法的逻辑就是去算需要填充多少位。将
len
和 1 去按位与是为了看右移后的len
是奇数还是偶数,比如:根据
len
的奇偶觉得填充字符串要不要补上一个。循环中的
len
,每次右移动后,判断剩下的len
,还能继续右移吗,如果可以,就将填充字符串pad
倍增ch+=ch
(字符串倍增)。这样的逻辑是的
left-pad
更加高效了。无法理解的同学,可以单步调试下
补充 ES6/7 相关字符串拓展
.repeat()
repeat
方法返回一个新字符串,表示将原字符串重复n次。.padStart(),.padEnd()
ES7推出了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。
padStart
用于头部补全,padEnd
用于尾部补全。最后
我们没要必要排斥在 JS 中使用位运算,欢迎大家补充更多的使用实例。