此系列体验视频教程
点击观看:哔哩哔哩
运算符2
布尔运算符(逻辑运算符)
与运算符 &&
与运算符(&&)往往用于多个表达式的求值。
- 运算规则:
- 如果第1个运算子的布尔值为
true,则返回第2个运算子的值(注意是值,不是布尔值) - 如果第1个运算子的布尔值为
false,则直接返回第1个运算子的值,且不再对第2个运算子求值。
- 如果第1个运算子的布尔值为
't' && '' // ""
't' && 'f' // "f"
't' && (1 + 2) // 3
'' && 'f' // ""
'' && '' // ""
如果第1个运算元为false,就不会在执行后面的代码,称为“ 短路 ”
// 短路
var x = 1;
(1 - 1) && ( x += 1) // 0
x // 1
与运算符可以多个连用,返回第1个为false的值。或返回最后1个的值。
true && 'foo' && '' && 4 && 'foo' && true
// ''
1 && 2 && 3
// 3
或运算符 ||
或运算符(||)也用于多个表达式的求值。
- 运算规则:
- 如果第1个运算子的布尔值为
true,则返回第1个运算子的值,且不再对第2个运算子求值 - 如果第1个运算子的布尔值为
false,则返回第2个运算子的值。
- 如果第1个运算子的布尔值为
't' || '' // "t"
't' || 'f' // "t"
'' || 'f' // "f"
'' || '' // ""
短路规则对这个运算符也适用。
如果第1个运算元为true,就不会在执行后面的代码
var x = 1;
true || (x = 2) // true
x // 1
或运算符可以多个连用,返回第1个为true的值。或返回最后1个的值。
false || 0 || '' || 4 || 'foo' || true
// 4
false || 0 || ''
// ''
非运算符 !
- 非运算符:!
- !布尔值 => 取反布尔值
- ! 非布尔值 => 先转换为布尔值再取反
- !! => 两次取反 <=> Boolean函数
// 为false的六个值
!!false // false
!!undefined // false
!!null // false
!!0 // false
!!NaN // false
!!"" // false
三元运算符 ? :
三元运算符由问号 ? 和冒号 : 组成,分隔3个表达式。
如果第1个表达式的布尔值为true,则返回第2个表达式的值,否则返回第3个表达式的值。
't' ? 'hello' : 'world' // "hello"
0 ? 'hello' : 'world' // "world"
比较运算符(关系运算符)
比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件。
JavaScript 一共提供了8个比较运算符。
- > 大于运算符
- < 小于运算符
- <= 小于或等于运算符
- >= 大于或等于运算符
- == 相等运算符
- === 严格相等运算符
- != 不相等运算符
- !== 严格不相等运算符
大小的比较
如果两个运算子之中,至少有一个不是字符串的基本类型的值,则是先转成数值再比较。
9 > '6' // true
true > false // true
2 > true // true
这里需要注意与NaN的比较。任何值(包括NaN本身)与NaN进行大小的比较,返回的都是false。
1 > NaN // false
1 <= NaN // false
'1' > NaN // false
'1' <= NaN // false
NaN > NaN // false
NaN <= NaN // false
相等比较
是否相等运算符==
值是否相等
1 == 1.0 // true
非数值类型的值会转换成数值再进行比较。
1 == '1' // true
1 == true // true
'true' == true // false
'' == 0 // true
'' == false // true
'1' == true // true
undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。
false == null // false
false == undefined // false
0 == null // false
0 == undefined // false
undefined == null // true
不相等运算符!=:先看是否相等,再取反
是否全等运算符===
值和类型是否全等
值相等,类型不同
1 === "1" // false
true === "true" // false
值和类型都相同,进制不同
1 === 0x1 // true
复杂类型(引用类型)比较地址
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
var v1 = {};
var v2 = v1;
v1 === v2 // true
需要注意的是,NaN与任何值都不相等(包括自身)
NaN === NaN // false
+0 === -0 // true
undefined === undefined // true
null === null // true
全不等!==:先看是否全等,再取反
1 !== '1' // true
65 !== 0o101 // false
运算符优先级
- 小括号:()
- 一元运算符:! ++ --
- 算术运算符:先 * / % 再 + -(二元运算符)
- 比较运算符:> >= < <=
- 是否相等运算符: === == !== !=
- 布尔运算符:先 && 再 ||
- 赋值运算符:=
- 逗号运算符:,
优先级越低越靠后计算
结合性
- 左结合:相对于把左边的表达式加上小括号
- 右结合:相对于把右边的表达式加上小括号
只有幂运算符和赋值运算符是右结合。判断执行顺序的时候,优先级在结合性之前
console.log(2 ** 3 ** 2); // 512
var x = 123
var y = 456
x = y = 3 + 36 / 3 * 2
console.log(x); // 27
console.log(x); // 27
练习
- 判断输出的结果
var a = 68
console.log('10.00' <= 0xa || '9.00' == 0o11 && 5 + 26 <= a++ - 76 / 2);
- 判断输出的结果
var a = 68
console.log(5 + 26 <= ++a - 76 / 2 && 16 + 69 / 3 * 2 < 30 && 2 ** 3 ** 2 > 500);