1 - 运算符(操作符)

1.1 运算符的分类

运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。

JavaScript中常用的运算符有:

  • 算数运算符
  • 递增和递减运算符
  • 比较运算符
  • 逻辑运算符
  • 赋值运算符

1.2 算数运算符

  • 算术运算符概述
    概念:算术运算使用的符号,用于执行两个变量或值的算术运算。
    图片1(1).png
  • 浮点数的精度问题
    浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。
    所以:不要直接判断两个浮点数是否相等 !

    1. var result = 0.1 + 0.2; // 结果不是 0.3,而是:0.30000000000000004
    2. console.log(0.07 * 100); // 结果不是 7, 而是:7.000000000000001
  • 表达式和返回值
    表达式:是由数字、运算符、变量等以能求得数值的有意义排列方法所得的组合
    简单理解:是由数字、运算符、变量等组成的式子
    表达式最终都会有一个结果,返回给开发者,称为返回值

1.3 递增和递减运算符

  • 递增和递减运算符概述
    如果需要反复给数字变量添加或减去1,可以使用递增(++)和递减( — )运算符来完成。
    在 JavaScript 中,递增(++)和递减( — )既可以放在变量前面,也可以放在变量后面。放在变量前面时,我们可以称为前置递增(递减)运算符,放在变量后面时,我们可以称为后置递增(递减)运算符。
    注意:递增和递减运算符必须和变量配合使用。
  • 递增运算符
    • 前置递增运算符
      ++num 前置递增,就是自加1,类似于 num = num + 1,但是 ++num 写起来更简单。
      使用口诀:先自加,后返回值
  1. var num = 10;
  2. alert(++num + 10); // 21
  • 后置递增运算符
    num++ 后置递增,就是自加1,类似于 num = num + 1 ,但是 num++ 写起来更简单。
    使用口诀:先返回原值,后自加
  1. var num = 10;
  2. alert(10 + num++); // 20

1.4 比较运算符

  • 比较运算符概述
    概念:比较运算符(关系运算符)是两个数据进行比较时所使用的运算符,比较运算后,会返回一个布尔值(true / false)作为比较运算的结果。
    图片2.png
  • 等号比较
    图片3.png
    1. console.log(18 == '18');
    2. console.log(18 === '18');

1.5 逻辑运算符

  • 逻辑运算符概述
    概念:逻辑运算符是用来进行布尔值运算的运算符,其返回值也是布尔值。后面开发中经常用于多个条件的判断
    图片4.png
  • 逻辑与&&
    两边都是 true才返回 true,否则返回 false
    图片5.png
    图片6.png
  • 逻辑或 ||
    两边都是 true才返回 true,否则返回 false
    图片7.png
    图片8.png
  • 逻辑非 !
    逻辑非(!)也叫作取反符,用来取一个布尔值相反的值,如 true 的相反值是 false

    1. var isOk = !true;
    2. console.log(isOk); // false
  • 短路运算(逻辑中断)
    短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值;

    • 逻辑与
      语法: 表达式1 && 表达式2
      ```
    • 如果第一个表达式的值为真,则返回表达式2

    • 如果第一个表达式的值为假,则返回表达式1

      1. ```javascript
      2. console.log( 123 && 456 ); // 456
      3. console.log( 0 && 456 ); // 0
      4. console.log( 123 && 456&& 789 ); // 789
    • 逻辑或
      语法: 表达式1 || 表达式2
      ```

    • 如果第一个表达式的值为真,则返回表达式1

    • 如果第一个表达式的值为假,则返回表达式2

      1. ```javascript
      2. console.log( 123 || 456 ); // 123
      3. console.log( 0 || 456 ); // 456
      4. console.log( 123 || 456 || 789 ); // 123

1.6 赋值运算符

概念:用来把数据赋值给变量的运算符。

图片9.png

  1. var age = 10;
  2. age += 5; // 相当于 age = age + 5;
  3. age -= 5; // 相当于 age = age - 5;
  4. age *= 10; // 相当于 age = age * 10;

1.7 关系运算符

  • 返回一个布尔值(true或者false);
  • 规则:
    • 使用非数值时,也要进行数据转换;
    • 两个操作数都是数值,则执行常规数值比较;
    • 两个操作数都是字符串,则比较两个字符串对应的字符编码值;
      • 大写字母的字符编码小于小写字母的字符编码(A=65,a=97);
      • 数字字符串(比较的是字符编码),”23” < “3”;//true
    • 一个数是数值,将另一个操作数转换成数值,然后进行比较;
      • 数字和字符串比较,会把字符串转换为数值,例如: “23” < 3;//false;
    • 对象调用valueOf()方法或者toString()方法得到结果进行比较;
    • 一个数是布尔值,则将其转换为数值再进行比较;
    • 任何数与NaN比较,都会返回false;
  • 特殊情况:

    • 要比较相等性之前,不能将null和undefined转换成其他任何值.

      • undefined和null与其他数在进行相等判断时不进行类型转换;
        1. console.log(null == 0);//false
        2. console.log(null == undefined);//true
    • =的结果可以根据<的结果推出(undefined除外 因为会转化为NaN;同样NaN除外);

    • 而==的结果与>=没有任何关系,即>=的结果不是>和结果的累和;
      1. null>0 //null转化为number,为0,所以0>0结果为false.
      2. null>=0 //null转化为number,为0>=0,所以结果为true.
      3. null==0// null在做相等判断时,不进行转型,所以null和0为不同类型数据,结果为false。

      1.8 相等运算符

  • 分类

    • 相等和不相等: 先转换再比较;
    • 全等和不全等: 仅比较而不比较;
  • 1.8.1相等和不相等(==,!=)先转换(强制转型)再比较相等性;
    • 有一个是布尔值,将其转换成数值(0和1);
    • 一个是字符串,一个是数值,将字符串转为数值;
    • 只有一个对象时,调用valueOf()方法得到值,再利用前面规则进行比较;
    • NaN相等性操作都返回false,不等操作都返回True;
  • 1.8.2全等与不全等(===,!==)
    • 比较数值与类型,缺一不可;
    • 推荐使用全等与不全等操作符;
  • 1.8.3相等运算符的优先级与结合性

    • 从左至右计算;
    • 关系运算符中> < >= <= 的优先级高于 == != === !==;

      1.9 逗号运算符

  • 概念

    • 使用逗号操作符可以在一条语句中执行多个语句;
    • 用于声明多个变量;
    • 用于赋值,总会返回表达式中的最后一项;
      1. let num = (1,2,3,4,5,6,0);
      2. console.log(num);//0
  • 优先级和结合性

    • 从左至右的计算;
    • 优先级最低;

      1.10 三元运算符

  • 变量名 = 条件表达式 ? 值1 : 值2;

    1. let num1 = 5,num2 = 6;
    2. let max = (num1 > num2) ? num1 : num2;
    3. console.log(max);

    1.11 位运算符

  • 概念:

    • 按内存中表示数值的位来操作数值,数值按IEEE-754 64位格式存储;
    • 将64位的值转换成32位的整数,然后执行操作,最后将结果转回64位;
    • 有符号整数:
      • 31位用于表示整数的值;
      • 第32位(最高位)表示数值的符号(0表示整数,1表示负数);
      • 负数以二进制补码存储:
        • 求该数正值的二进制:
        • 求二进制反码;
        • 二进制反码加1;
    • 无符号整数:
      • 前32位用于表示整数的值;
    • 对非数值进行位操作,会先使用Number()转换为数值,再进行位操作;
  • 1.10.1按位非(~)
    • 返回数值的反码;
    • 操作数的负值减1;
  • 1.10.2按位与(&):
    • 两个数值的二进制数值一一对应,两位数都是1才返回1;
  • 1.10.3按位或(|)
    • 两个数值的二进制数值一一对应,两位数都是0才返回0,有1返回1;
  • 1.10.4按位异或(^)
    • 两个数值的二进制数值一一对应,两位数都是0或者1才返回0,不同就返回1;
  • 1.10.5左移(<<)与右移(>>)
    • 左移:向左移n位,就乘以(2^n),空余部分用0填补,不会影响操作数的符号位;
    • 右移:向右移n位,就除以(2^n);
      • 有符号右移(保留符号位):空余部分用符号位的值填充空白;
      • 无符号右移(>>>):空余部分用0填充空位;

        1.12 运算符优先级

图片10.png

  • 一元运算符里面的逻辑非优先级很高
  • 逻辑与比逻辑或优先级高