3:运算符 + 运算符优先级 [ 逻辑短路 ]

知识梳理

//1 浮点数不要直接参与数学运算
//2 逻辑运算中的 逻辑中断是个重要知识点
//3 后加加  表达式先返回值 变量再自增1
//4 一元运算中的 逻辑非 优先级最高

一  算数运算符

1)基本使用

加 减 乘 除 取模
应该避免用浮点数运算和相等比较

2)浮点数运算

尽量避免让浮点数直接参与运算 会有误差

原理:程序需要把浮点数转化为二进制,再进行运算,就会有误差

console.log(0.1+0.2); //竟然不是0.3  而是:0.30000000000000004
console.log(0.07 * 100); //竟然不是7 而是:7.000000000000001

3)浮点数比较

var num = 0.1 + 0.2;
console.log(num == 0.3);//返回 false 它们不相等

不要直接用浮点数做相等比较

浮点数值最高精度是17位小数,但是在计算的时候精度远远不如整数

4)如何判断一个数能否被整除

它的余数是0,就说明这个数能被整除
这是 取模
% 最主要的使用场景

二 递增递减运算符

1)概念

//1 自增自减必须配合变量使用
//2 前加加 和 后加加 单独使用时结果是一样的
//3 与其他代码一起使用时,结果会不一样
//4 工作中最常用的是后加加

1)前加加

//1 表达式先自增1,再返回值

//2 表达式的值  和 变量的值是同步的

2)后加加 [ 重难点 ]

//1 表达式先返回原值  变量再自增1

//2 变量的值始终比表达式的值大1

3)demo练习

<script>
    //++a 先自加 再返回自增后的值
    //前置比较好理解 表达式的返回值和变量值是同步的
    var a = 10;
    ++a; //表达式++a=11 变量a=11
    var b = ++a + 2; //表达式++a=12 变量a=12
    console.log(b);//14

    //后加加:先返回表达式原值 变量再自加1
    var c = 10;
    c++;//表达式c++=10  变量c=11
    var d = c++ +2;//1表达式c++ = 11 变量c=12 //2 我们这里使用的是表达式c++
    console.log(d);//13
    console.log(c);//12

    //重点理解这个
    var e = 10;
    var f = e++ + ++e;//1 表达式e++=10 变量e=11 //2 表达式++e=12 变量e=12
    console.log(f);//10+12=22
</script>

三  比较运算符

1)基本使用

大于 大于等于  小于  小于等于  等于 不等于  全等于 全不等

2)难点

//1 等于:值相等就是真 类型不同没有关系
//2 全等于:一摸一样 要求两边的值要相等 并且 类型也要相同才为真
console.log(18 == '18');//true [ 系统把字符串18转换为数字类型后再比较 ]
console.log(18 === '18');//false 

四  逻辑运算符

1)布尔值参与运算

逻辑与  &&  and     true&&false = false  //有一个条件是假 整个表达式结果就是假

逻辑或  ||  or      true||false = true  //有一个条件是真 整个表达式结果就是真

逻辑非  !   not     !true = false        //真变成假  假变成真

demo练习

<script>
    var num = 7;
    var str = "我爱你~中国~";
    console.log(num > 5 && str.length >= num); // true
    console.log(num < 5 && str.length >= num); // false 左边表达式为假
    console.log(!(num < 10)); // false 括号里为真
    console.log(!(num < 10 || str.length == num)); // false 括号里为真
</script>

2)短路运算 ( 逻辑中断 )

//1 正常情况:布尔值参与运算  true && false = false

//2 特殊情况:值或表达式参与逻辑运算,123 && 456 结果是啥? 用到了短路运算

//3 短路运算原理:当有多个表达式(或值)时,左边表达式的值可以确定结果时,就不再运算右边表达式

2.1 逻辑与短路运算

//1 第一个表达式的值为真  返回表达式2

//2 第一个表达式的值为假  返回表达式1  [ 逻辑中断 后面的就不执行了 ]
console.log(123 && 456);//返回 456
console.log(0 && 456);//返回0  在数字中只有0是false
console.log(0 && 456 && 100);//返回0  表达式1为假 后面就不执行了

2.2 逻辑或短路运算

//1 第一个表达式的值为真  返回表达式一  [ 逻辑短路 后面的不执行了 ]

//2 第一个表达式的值为假  且第二表达式值为真 直接返回表达式二  [ 后面的就不执行了 ]

//3 如果第二个表达式值为假 返回第三个表达式
console.log(123 || 456);//返回 123
console.log(0 || 456);//返回456

console.log('' || NaN || 0 || 100);//返回100 [ 重点理解这个 ]
//1 表达式1的假  返回表达式2
//2 表达式2的值也是假  返回表达式3
//3 表达式3的值也是假 返回表达式4
// 如果后面还有 依次类推比较

2.3 逻辑中断非常重要

会影响到代码的执行结果
var
num = 0; console.log(123 || num++);//逻辑或的逻辑中断 123为真 后面的num++就没有执行 console.log(num);//所有 变量num还是0

五  赋值运算符

=   直接赋值

+= -= 加减一个数后再赋值

*= /= %= 乘 除 取模后再赋值

var num = 10;
num += 5; 等同于 num = num + 5;

 代码示例

//加等 +=
var num = 15;
num += 5;//num+5后再赋值给num
console.log(num);//20

//模等 %=
var num = 15;
num %= 2;//num = num % 2; 取模运算后把值赋给左边的变量
console.log(num);//1  15除以2=7余1

六  运算符优先级

1   小扩号     ()

2   一元运算符    ++ -- !  [ 一元运算符:一个变量就可以运算的 ]

3   算数运算符    先乘除取模 后加减

4   关系运算符    > >= < <=

5   相等运算符    == !=  ===  !==

6   逻辑运算符    先&&  后  ||

7   赋值运算符    =

8   逗号运算符   ,

//数字代表优先级 越小优先级越大

 3:运算符 + 运算符优先级 [ 逻辑短路 ]

练习题 1

console.log(4 >= 6 || '' != '阿凡达' && !(12 * 2 == 144) && true);//true
//           false || true && true && true
//           false || true  最后结果是 true

var num = 10;
console.log(5 == num / 2 && (2 + 2 * num).toString() === '22');//true
//              true && true  最后结果是 true

练习题 2

<script>
    var a = 3 > 5 && 2 < 7 && 3 == 4;
          //false && true && false
    console.log(a);//变量 a = false
    
    var b = 3 <= 4 || 3 > 1 || 3 != 2;
         // false || true || true
    console.log(b); //变量 b = true
    
    var c = 2 === "2";
    // false
    console.log(c);//变量c = false
    
    var d = !c || b && a;
    //true || true && false
    //true || false 最后变量d = true
    console.log(d);//true
</script>