# 表达式和运算符

作者: 多叉树;转载须注明出处

表达式:是由操作数和运算符(可选)构成的并产生运算结果的语法结构。例如:3+5

运算符:进行计算或者逻辑运算的符号,比如表达式中的 + 号

表达式分类:算术、关系、逻辑、赋值、组合

# 算术运算符

以下符号都是算数运算符,运算符的关键词就是运算

意义 运算符
+
-
*
/
取余 %

在算数表达式中, 乘法和除法的优先级要高于加法和减法;

不过可以使用括号来改变运算的顺序


1 + 1 = 2

// 1 + 2 先于 乘4 运算 , 括号改变了又相继
(1+2) * 4 = 12

// 取余操作,只关注余数
11 % 3 = 2

// 能够除尽的,余数是0
9 % 3 = 0 ; 

隐式类型转换

  • 如果参与数学运算的操作数不是数字类型,那么JS会自动将操作数转成数字型,。
  • 隐式转换的本质是内部调用Number() 函数
    • 号比较特殊, 如果 是 数字 和 字符串 相加 表示连接,并不会发生隐式类型转换
// 除了加号外都可以用隐式类型转换, 因为 加号 会代表 连接符
3 * '4' = 12

// + 表示连接符,而非 运算符
3 + '4' = '34';

小数运算

在JS中,有些小数运算不是很精确,会有一些精度损失

在进行小数运算的时候,要调用 toFixed() 方法保留指定的小数位数

0.1 + 0.33 // 输出  0.43000000000000005
// 使用 toFixed正确输出
Number(0.1 + 0.33).toFixed(2)

其他相关运算

幂运算

  • 使用Math.pow() 函数进行幂运算
  • 使用Math.sqrt() 函数进行开根号
// 计算2的3次方
Math.pow(2,3);
// 9 开根号
Math.sqrt(9)

向上取整和向下取整

  • 使用函数 Math.ceil() 向上取整
  • 使用函数 Math.floor() 向下取整

Math.ceil(2.3) // 输出3
Math.floor(2.3) // 输出2

Math.ceil(-2.3) // 输出 -2
Math.floor(-2.3)  // 输出 -3

# 关系运算符

以下的符号都是关系运算符, 关系运算符的关键词就是比较

意义 运算符
大于 >
小于 <
大于或等于 >=
小于或等于 <=
等于 =
不等于 !=
全等于 ===
不全等于 !==

# == 和 === 的区别

== 双等运算符不比较值的类型,它会进行隐式类型转换后比较值是否相等

=== 三等运算符不仅比较值是否相同,也比较类型是否相同

特殊值比较

// 输出true。
undefined == null ; 
// 输出false。 因为类型不同,null 的类型为 object, undefined 类型为 undefined 。所以不相等
undefined === null ; 
// 输出 false。 NaN不自等
NaN == NaN ; 

isNaN 函数

可以判断是不是一个数字

// 输出 true
isNaN(NaN); 
// 输出false
isNaN(5);

isNaN 传入 NaN 或者其他数字类型的值判断比较准确,除了数字类型外的其他类型值判断不准

isNaN(undefined); // true
isNaN('3天'); // true
isNaN(null); // false

# 逻辑运算符

以下的符号都是逻辑运算符, 逻辑运算符的关键词就是真假。其运算的结果 要么 是 真(true) 要么是假(false)

意义 运算符 解释 举例
! 表示 非 也可以说是 置反运算, 其结果一定一个bool值 !true = false
&& 表示 并且 ,多个条件都为真才真,口诀: 一假则假 。 具有短路功能 true && true = true

逻辑运算符可以比较任意值,不过输出结果只能为 布尔值

表示取反的意思

//false
!true ; 
// true
!false; 
// true
!0 
// true
!undefined 
!'' // true
!'halouworld' //非空字符串取反 为 false

与表示有多个并列条件,只有都满足的时候才会向下执行,否则跳过。通常和 后面讲到的 IF 配合使用

使用口诀:一假则假

<script>

        var a = 1, b = 2, c=3, d=4;

        // a 虽然和b 相等, 但是 c和d不相等,所以结果还是不想等
        if( a== b && c==d) {
            console.log('都成立')
        } else {
            console.log('都不成立')
        } 

</script>

或表示有多个并列条件,只要其中一个满足就会向下执行,否则跳过。通常和 后面讲到的 IF 配合使用

使用口诀:一真则真

<script>
        
      var a = 1, b = 1, c=3, d=4;
      // a == b 后者 c==d 只要有个一个相同就相等, 结果输出相等
      if( a== b || c==d) {
          console.log('成立')
      } else {
          console.log('不成立')
      } 
</script>

短路

短路就是 在一组 或者 当中 ,如果提前运算出了结果, 就结束了, 后面的表达式则不会被执行

  • 与 1!=1 &&  1=2 , 当前面的表达式 1 != 1假, 所以整个表达式结果为, 后面的 1=2 则不会被执行到, 参考口诀 一假则假
  • 1==1 || 1==2 , 当前面的表示式  1==1,所以整个表示式结果为, 后面的 1==2 则不会被执行到, 参考口诀 一真则真

# 赋值运算符

以下的符号都是赋值运算符, 赋值运算符的关键词就是赋值。即符号右边的值赋值给左边

符号 意义 举例
= 赋值 a = 10
+= 左右相加并赋值给左边 a = 10 ; b = 10 ;a +=b
-= 左边减右边并赋值给左边 a -= b
*= 左右相乘并赋值给左边 a *= b
/= 左边除以右边并赋值给左边 a /= b
%/ 左边取余右边并赋值给左边 a %= b
++ 自增运算(自身增1) a++ ; ++a
-- 自减运算 (自身减1) a--; --a;

赋值运算符就是将右边的赋值给左边

# 左边的值赋值给右边的变量
a = 1;
# 连续赋值
var a,b,c;
a = b = c = 1;
console.log(a);
console.log(b);
console.log(c);

+= 等举例

// 等价于 a = a + 5;
a += 5; 

# 表达式组合

由运算符和操作数共同组成的复杂运算表达式

其中的运算顺序(优先级)

非运算 -> 数学运算 -> 关系运算 -> 逻辑运算

举例

// 输出true
5 < 3 + 3; 
 // 输出 true ,这种复杂的表达式在不加括号的时候看着比较乱
3 > 2 && 8 > 3+ 4
// !13 = false , 等价于 !Boolean(13)
// 输出 true, 小于号左边为false, 转成整数值 Number(false) = 0 和 右边的运算结果 3 相比较
!13 < 6 - 3

# 总结

特别注意 表示式组合当中,比较复杂的表达式,一定要加上括号,方便以后阅读理解