JavaScript网页编程之操作符

217 阅读4分钟

操作符

学习目标:掌握各种操作符的用法

  • 操作符:也叫运算符,是js中发起运算最简单的方式
  • 表达式(expression):组成包含操作数和操作符,表达式会得到一个结果,然后用结果参与程序。

算术运算符

  • + - * / % ()
  • %:取余,取模。即:a/b = c 余 d,就是说a%b=d
  • 运算顺序:先乘除,后加减,有小括号先算小括号

正常情况

数字与数字之间的运算

  console.log(1 * 2);

非正常情况1

有特殊字面量(NaN、infinity)参与的运算

  • NaN参与的运算:得到的结果都是NaN
  • Infinity参与的运算,视情况而定
    console.log(Infinity * Infinity); //infinity
    console.log(Infinity / Infinity); //NaN
    console.log(Infinity + Infinity);  //infinity
    console.log(Infinity - Infinity);  //NaN
    console.log(Infinity % Infinity);  //NaN
            
    console.log(Infinity * 8); //infinity
    console.log(Infinity / 8); //infinity
    console.log(Infinity + 8);  //infinity
    console.log(Infinity - 8);  //infinity
    console.log(Infinity % 8);  //NaN

    console.log(-Infinity * 8); //-infinity
    console.log(-Infinity / 8); //-infinity
    console.log(-Infinity + 8);  //-infinity
    console.log(-Infinity - 8);  //-infinity
    console.log(-Infinity % 8);  //NaN
    console.log(5 / Infinity);  //0
    console.log(5 % Infinity);  //5
  • 总结:工作中并不会使用特殊值运算,没有实际应用的意义,但是要了解,以防面试遇到。

非正常情况2

其他数据类型参与数学运算

  • 有字符串参与的+运算:+号变为连字符将前后连接成整体字符串。
  • 隐式转换:除了字符串参与的+运算,其他情况下,所有其他数据类型参与数学运算时,计算机暗中将其他数据类型先自动转换成数字类型,再参与运算,这个过程中不需要使用parseInt()、Number()等方法,过程是暗中进行,这就是一个隐式转换的过程。
隐式转换

其他的数据类型会隐式转换为数字类型:

  • 对应数字:纯数字字符串会转为对应的数字"123" → 123
  • 转换为1 → true
  • 转换为0 → false、null、空字符串、空白字符串
  • 转换为NaN → undefined、非空非纯数字字符串

比较运算符

  • 也叫关系运算符。一个比较运算符comparison operator比较它的操作数并返回一个布尔类型值。运算结果要么是true,要么是false > 大于 < 小于 >= 大于等于 <= 小于等于 == 相等,只判断值大小是否相等,不判断数据类型 != 不等,与相等完全相反 === 全等,不光判断值相等,还要判断数据类型相等 !== 不全等,与全等于完全相反

正常情况

数字与数字比较

非正常情况1

特殊值(NaN、infinity)参与比较运算

  • NaN参与:不等于和不全等于结果是true,其他的都得到false
  • infinity参与的运算,视情况而定: 规定infinity == infinity(为:true)
    console.log(Infinity > Infinity); //false
    console.log(Infinity >= Infinity);  //true
    console.log(Infinity < Infinity); //false
    console.log(Infinity <= Infinity); //true

    console.log(Infinity == Infinity); // 规定:true
    console.log(Infinity != Infinity); //false
    console.log(Infinity === Infinity); //true
    console.log(Infinity !== Infinity); //false

非正常情况2

其他数据类型参与比较运算(排除字符串与字符串的比较)

  • 其他数据类型也会隐式转换数字参与比较 "123" → 123 true → 1 false → 0 null → 0 undefined → NaN "" → 0 "abc" → NaN
  • null的判断比较特殊(因为在此处认为:null是无限趋近于0): null与0判断时,相等判断为false,不等于也是false, >= 和 <= 判断为true
  // null的特殊情况
  console.log(0 == undefined); //false
  console.log(0 == null);  //false
  console.log(0 >= null);  //true
  console.log(0 <= null);  //true
  console.log(1 > null); //true
  • null == undefined

非正常情况3

字符串与字符串比较

  • 不会发生隐式转换为数字,而是比较两个字符串的Unicode编码
  • 字符编码顺序:从前往后0 ~ 9、A ~ Z、a ~ z ,前面的小于后面的。
  • 比较时不关心两个字符串的长度,从第一个字符开始比较,依次往后顺延比较,直到比较出大小,就不再往后比较。
  console.log(8 < "12"); //true
  console.log("8" < "12"); //false

比较运算符运算顺序

  • 之前学习有关数学的部分计算知识在js中不适用
  // 3 > 2 是一个表达式,因此会计算出一个值:true  也就转换为:console.log(true > 1); 此时显示为:false
  console.log(3 > 2 > 1); //false

逻辑运算符

逻辑运算符常用于布尔类型值之间;当操作数都是布尔值时,返回值也是布尔值。

  /* &&  逻辑与运算符 且
     ||  逻辑或运算符 
     !  逻辑非运算符
  */   

正常情况

布尔类型的值的运算,返回值为布尔值。

  console.log(!true); //false
  console.log(true && false);  // false

非正常情况

其他数据类型的值也可以参与逻辑运算。运算过程中需要将操作数隐式转换为布尔类型的值,参与判断计算,最终运算结果还是原来的某个位置的数据

  • 并不是所有逻辑运算返回结果都是布尔值,其他数据参与得到的就是数据本身。
 console.log(null && "12"); //null

隐式转换为布尔值的规律

  • 转换为false: NaN、undefined、null、0、""
  • 转换为true: 非0 非NaN数字、非空字符串(包含" ")
  • 当它们用于非布尔值的时候,返回值就可能是非布尔值。
    • (逻辑与a && b)如果a为false,返回a;否则返回b.
    • (逻辑或a || b)如果a为true,返回a;否则返回b.

逻辑运算符运算顺序

  • 综合运算顺序:非(先计算就近的)、与、或
  /* 1. !8 -> false
     2. null && undefined -> null
     3. null || false -> false
  */
  var n = null && undefined || !8;
  console.log(n);  // false

赋值运算符

  /* 
    赋值运算符符号
    =      等于
    +=     加等于
    -=     减等于
    *=     乘等于
    /=     除等于
    %=     取余等于
    ++     递加
    --     递减
  */

一元运算符

  • ++和--也叫一元运算符,只有一个操作数
  • 以++为例:
    • a++: 先参与,后自加
    • ++a: 先自加,后参与
  • 实际举例
  //采用解题两行法
  var a = 10,b = 20,c = 30;
// 当前值: 10     21    30    12
  var sum = a++ + ++b + c++ + ++a;
// 新值:   11     21    31    12
  console.log(sum);  // 将第一行值加起来:73 

运算优先级

  /*
    运算优先级:
    ()
    一元运算符:++ -- !
    算数运算符:* / % + - 
    关系运算符: > < >= <=
    相等运算符: == != === !===
    逻辑运算符:&& ||
    赋值运算符:=
  */
  • 案例:
  var a = 4;
  var num = 1 * (2 + 3) && ++a || 5 > 6 && 7 < 8 || !9;
  console.log(num);  // num = 5;