每天3小时学前端之JS-第8天-布尔运算符+比较运算符

706 阅读4分钟

此系列体验视频教程

点击观看:哔哩哔哩

运算符2

布尔运算符(逻辑运算符)

与运算符 &&

与运算符(&&)往往用于多个表达式的求值。

  • 运算规则:
    • 如果第1个运算子的布尔值为true,则返回第2个运算子的值(注意是值,不是布尔值)
    • 如果第1个运算子的布尔值为false,则直接返回第1个运算子的值,且不再对第2个运算子求值。
'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个运算子的值。
'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

undefinednull与其他类型的值比较时,结果都为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

练习

  1. 判断输出的结果
var a = 68
console.log('10.00' <= 0xa || '9.00' == 0o11 && 5 + 26 <= a++ - 76 / 2);
  1. 判断输出的结果
var a = 68
console.log(5 + 26 <= ++a - 76 / 2 && 16 + 69 / 3 * 2 < 30 && 2 ** 3 ** 2 > 500);