1. + 号
此时,+ 不能称为加号, 它有转化成数值型的功能;
typeof + '1' => number
typeof + 'aaa' => number
console.log( + 'aaa' ) => NaN
2. 数组的reduce方法
Array的reduce()把一个函数作用在这个 Array 的 [x1, x2, x3...] 上,这个函数必须接收两个参数,reduce() 把结果继续和序列的下一个元素做累积计算,其效果就是:
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
var arr = [1, 2, 3, 4];
var b = arr.reduce(function(x, y) {
return x + y;
})
console.log(b); // 10
3. 数组去重 用 filter 方法
r = arr.filter(function (element, index, self) {
return self.indexOf(element) === index; // 通过判断本身位置 与 第一个找到的位置, 是否一样
});
4. parseInt() 可以传第二个参数, 用来指定用什么进制来解析
console.log(parseInt('FF', 16)) // 255
--------------------------- 位移/异或--------------------------
>> 与 >>> 是一样的
n = n >> 1; 相当于将n 除以2 取其商
数学意义: 右移一位相当于除以2, 右移n位, 相当于除以2的 n次方
1 << 24 ,1 左移24位, 就是2 的24次方
let num = 101;
console.log(num >> 1); // 50
console.log(num >> 2); // 25
console.log(num >> 3); // 12
console.log(num >> 4); // 6
console.log(num >> 5); // 3
console.log(num >>> 1); // 50
console.log(num >>> 2); // 25
console.log(num >>> 3); // 12
console.log(num >>> 4); // 6
console.log(num >>> 5); // 3
随机颜色
console.log(parseInt(~~(Math.random() * (1 << 24)), 10).toString(16))
console.log(~~(Math.random() * (1 << 24)))
console.log((parseInt('FFFFFF', 16) + 1) >> 23); // 2
console.log((parseInt('FFFFFF', 16) + 1) >> 24); // 1
监测n 是否为非负整数
if( n === (n >>> 0)) { }
let num1 = -10;
console.log(num1 >>> 0) // 4294967286
console.log(num1 >> 0) // -10 没有发生任何变化
console.log(num1 << 0) // -10 没有发生任何变化
let num2 = 10.8;
console.log(num2 >>> 0) // 10
console.log(num2 >> 0) // 10
console.log(num2 << 0) // 10
let num3 = -10.2;
console.log(num3 >>> 0) // 4294967286
console.log(num3 >> 0) // -10
console.log(num3 << 0) // -10
>> << 可以用来取整
>>> 没问题 <<< 会报错
----------------- 下面的是复制 别人的 很不错 ---------------------------
大多数语言都提供了按位运算符, 恰当的使用按位运算符有时候会取得的很好的效果。
在我看来按位运算符应该有7个:
1、 & 按位与
&
是二元运算符, 它以特定的方式的方式组合操作数中对应的位, 如果对应的位都为1, 那么结果就是1, 如果任意一个位是0 则结果就是0。
1 & 3 的结果为1
那我们来看看他是怎么运行的
1 的二进制表示为 0 0 0 0 0 0 1
3 的二进制表示为 0 0 0 0 0 1 1
根据 & 的规则 得到的结果为 0 0 0 0 0 0 0 1, 十进制表示就是1
2、 | 按位或
|
运算符跟 & 的区别在于如果对应的位中任一个操作数为1 那么结果就是1。
1 的二进制表示为 0 0 0 0 0 0 1
3 的二进制表示为 0 0 0 0 0 1 1
所以 1 | 3 的结果为3
3、 ^ 按位异或
^
运算符跟 | 类似, 但有一点不同的是 如果两个操作位都为1的话, 结果产生0。
1 的二进制表示为 0 0 0 0 0 0 1
3 的二进制表示为 0 0 0 0 0 1 1
所以 1 ^ 3 的结果为2
4、~按位非
~运算符是对位求反, 1 变0, 0 变1, 也就是求二进制的反码
1 的二进制表示为 0 0 0 0 0 0 1
所以~1 的结果是 - 2
5、 >> 右移
>>
运算符使指定值的二进制所有位都右移规定的次数, 对于其移动规则只需记住符号位不变, 左边补上符号位即按二进制形式把所有的数字向右移动对应的位数, 低位移出(舍弃), 高位的空位补符号位, 即正数补零, 负数补1。
1 的二进制表示为 0 0 0 0 0 0 1
所以 1 >> 1 的结果为0
6、 << 左移
<<
运算符使指定值的二进制所有位都左移规定的次数, 对于其移动规则只需记住丢弃最高位, 0 补最低位即按二进制形式把所有的数字向左移动对应的位数, 高位移出(舍弃), 低位的空位补零。
1 的二进制表示为 0 0 0 0 0 0 1
所以 1 << 1 的结果为2 7、 >>> 无符号右移
>>>
运算符忽略了符号位扩展, 0 补最高位, 但是只是对32位和64位的值有意义。
位运算符在js中的妙用:
1、 使用 & 运算符判断一个数的奇偶
偶数 & 1 = 0
奇数 & 1 = 1
那么0 & 1 = 0, 1 & 1 = 1
2、 使用~~, >> , << , >>> , | 来取整
~~3.14 = 3
3.14 >> 0 = 3
3.14 << 0 = 3 3.14 | 0 = 3 3.14 >>> 0 = 3( >>> 不可对负数取整)
注意:~~-3.14 = -3 其它的一样
3、 使用 << , >> 来计算乘除
乘法:
1 * 2 = 2
1 < > 1 = 1(2 / 2 的一次方)
4、 利用 ^ 来完成比较两个数是否相等
1 ^ 1 = 0
1 ^ 非1数! = 0
所以同一个数…… 同一个数等于0, 否则不等于0
5、 使用 ^ 来完成值交换
a = 1
b = 2
a ^= b
b ^= a
a ^= b
结果a = 2, b = 1
6、 使用 & , >> , | 来完成rgb值和16进制颜色值之间的转换
16 进制颜色值转RGB:
function hexToRGB(hex) {
var hex = hex.replace("#", "0x"),
r = hex >> 16,
g = hex >> 8 & 0xff,
b = hex & 0xff;
return "rgb(" + r + "," + g + "," + b + ")";
}
RGB转16进制颜色值:
function RGBToHex(rgb) {
var rgbArr = rgb.split(/[^\d]+/),
color = rgbArr[1] << 16 | rgbArr[2] << 8 | rgbArr[3];
return "#" + color.toString(16);
}
运行hexToRGB("#ffffff") 返回 "rgb(255,255,255)"
运行RGBToHex("rgb(255,255,255)") 返回 "#ffffff"