已经很久没记录知识了。今天写这篇文章是来自于一个问题的思考 (1.1 | 1 = 1)。我相信大多数人都知道这个答案,但是我细想发现并不明白其中原因,后来自己去百度了一下,发现自己的基础还是有点差,所以今天记录下位运算符和逻辑运算符的区别和用法。
首先先说一下他们的定义:
位运算符:位运算符处理32位数,使用该运算符的运算中的任何数值运算数都会被转成32位整数,结果会被转换成javaScript数
逻辑运算符:逻辑运算符用来进行逻辑运算,判断变量或者之间的逻辑关系
下面我们来看下他们的具体操作符的含义
位运算符
引用一张MDN中总结的位操作符定义表格:

表格中的比特位也就是32位二进制数中的每一个位数,列举一个40的32进制数:
0000000000000000000000000101000
列举其中与(AND)运算符的计算过程:
示例:9 | 10 = ?
9 (十进制) = 00000000000000000000000000001001 (二进制)
10 (十进制) = 00000000000000000000000000001010 (二进制)
9 | 10 (十进制) = 00000000000000000000000000001011 (二进制) = 11 (十进制)
如上图所示,按照定义在位运算中将操作数转化成32位整数,AND中任何数与1进行操作都是1,任何数与0进程操作得出自己,所以9 | 10 的位运算结果转化成javascript数也就是十进制数为11。然后再回到我的问题 1.1 | 1 = ?
1.1 (十进制) = 00000000000000000000000000000001 (二进制)1 (十进制) = 00000000000000000000000000000001 (二进制)-------------------------------------------------------------------1.1 | 1 (十进制) = 00000000000000000000000000000001 (二进制) = 1 (十进制)
这样一来我们的结果是不是很清晰了,对于其他位运算符可以根据上述表格进行自行计算,这里就不赘述了。
逻辑运算符
逻辑运算符通常用于布尔型(逻辑)值。这种情况下,他们返回一个布尔值,然后&&和 || 运算符会返回一个指定操作数的值,因此,这些运算符也用于非布尔值。这时,他们也会返回一个非布尔值。
逻辑运算符如下图所示(其中expr可能是任何一种数据类型,不一定是布尔值):

其中的expr可以是任意类型值,如果要将其转换成布尔类型值,有两种方法: ①使用非运算符(!!)来处理非布尔型值 ②使用Boolean构造函数来显示转换,还有一些常见的被转换称false的表达式有:
- null
- NaN
- 0
- 空字符串(“” or ‘’ or ``)
-
短路运算
由于逻辑表达式在相同优先级下是从左至右的,所以可以用以下规则进行”短路”计算:
- (some false expression) && (expr) 短路计算结果为假
- (some true expression) || (expr) 短路计算结果为真
短路意味着上诉表达式不需要全部被执行,当左边操作数被确定以后,表达式的值也就确定了,我们来看一个简单的示例:
/* 短路计算情况一 */false && 1// false/* 短路计算情况二 */true || 100// true
请注意,当存在运算符优先级时,表达式的结果可能就不同了,比如小括号包裹起来的操作将变成独立的表达式
false && true || true // 结果为truefalse && (true || true) // 结果为false
逻辑与(&&)
列举一些逻辑与(&&) 的示例
test1 = true && true // 返回truetest2 = true && false // 返回falsetest3 = false && true // 返回falsetest4 = false && (3 || 4) // 返回falsetest5 = 'car' && 'dog' // 返回'car'test6 = false && 'dog' // 返回falsetest7 = '' && 'cat' // 返回''test8 = 'cat' && false // 返回falsetest9 = false && '' // 返回falsetest10 = '' && false // 返回''
逻辑或(||)
列举一些逻辑或(||)的示例
test1 = true || true // 返回truetest2 = false || true // 返回falsetest3 = true || false // 返回truetest4 = 'cat' || 'dog' // 返回'cat'test5 = false || (3 == 4) // 返回falsetest6 = 'cat' | false // 返回'cat'test7 = '' || 'cat' // 返回'cat'test8 = false || '' // 返回''test9 = false || 'cat' //返回'cat'
在或与逻辑表达式中我总结了一下,除了短路计算以外可以更加具体的表现为:
逻辑或(||) : 左值为true时,取左值,左值为false时,取右值
逻辑与(&&): 左值为true时,取右值,左值为false时,取左值
逻辑非(!)
列举一些逻辑非(!)运算符的示例
test1 = !true // 返回falsetest2 = !false // 返回truetest3 = !'' // 返回truetest4 = !'Cat' // 返回false
双重非(!!) 运算符主要是显式地将任意值强制转换成其对应地布尔值。同样得Boolean构造函数也可以达到相同的效果,示例:
test1 = !!true // 返回truetest2 = !!false // 返回falsetest3 = !!{} // 返回truetest4 = !!(new Boolean(false)) // 返回falsetest5 = !!"" // 返回falsetest6 = Boolean(1) // 返回1test7 = !!Boolean(1) // 返回true
总结
了解了这一块的内容后,才发现自己的弟子很薄弱,以前觉得基础的东西没什么好挖掘的,还是太年轻呀,看来得抓着红宝书啃一啃了,MDN也是一个不错的javaScript学习渠道,里面的示例也很丰富,coding…
