cvooc

JS的一些骚操作

前言

这是一篇长更文章,我会在本章记录一些 JS 的编程技巧做备忘.

优雅的取整

//~是js中的一元操作符:按位取反.位运算的操作值要求是整数,其结果也是整数.所以取反两次,自然就是整数了.
var a = ~~2.33;
/*按位或运算 按位或运算符“|”是双目运算符.其功能是参与运算的两数各对应的二进位(也就是最后一位)相或.
只要对应的二个二进位有一个为1时,结果位就为1.参与运算的两个数均以补码出现.
例如:9|5可写算式如下: 00001001|00000101 00001101 (十进制为13)可见9|5=13 */
var b = 2.33 | 0;
/*>>是位移运算符,
即将一个二进制位的操作数按指定移动的位数向右(左)移位,移出位被丢弃,另一边的空位一律补0.*/
var c = 2.33 >> 0;
位移运算符解释
«左移运算符,num « 1,相当于 num 乘以 2
»右移运算符,num » 1,相当于 num 除以 2
»>无符号右移,忽略符号位,空位都以 0 补齐

如何最佳的让两个整数交换数值

常规的办法是:

var a = 1,
    b = 2;
a == b;
b = a - b;
a -= b;

这种办法缺点很明显,整形数据溢出,对于 32 位字符最大表示数字是 2147483647,如果是 2147483645 和 2147483646 交换就会失败. 那么何不试试这种办法呢?

a ^= b;
b ^= a;
a ^= b;

原理

^是位异或运算符,即直接对比数值的二进制数值,对 a 与 b 的对应位进行异或运算,同为 0 或者同为 1 时,对应位结果为 0;否则为 1. 上面的计算原理为一个整数与另外一个数进行两次异或运算仍然是其本身,那么现在重新进行上面的计算.

//a^=b等价于a = a^b
a = 001 ^ 010; //(a的结果为011)
b = 010 ^ 011; //(b的结果为001)
a = 011 ^ 001; //(a的结果为010)

听明白了吗?这样利用异或运算就可以实现交换两个数了.

一行代码完成评星判断

定义一个变量 rate,其值为 1-5,然后执行下面代码

"★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);

slice() 方法可从已有的数组中返回选定的元素.

arrayObject.slice(start, end);
参数描述
start必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推.
end可选.规定从何处结束选取.该参数是数组片断结束处的数组下标.如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素.如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素.

注意

该方法并不会修改数组,而是返回一个子数组.