JS系列 · 运算符

1,104 阅读5分钟

操作符

概念: 操作符也叫作运算符operate,是js中发起运算最简单的方式。

结构: 表达式的组成包含了操作数操作符,表达式会得到一个结果,然后用结果参与程序。

算数运算符

  • 算数运算符包含:
+  -  *  /  %  () 
  • 其中%表示:取余,取模。 a / b = c 余 d,就说a % b = d。

  • 运算顺序:先算乘除取余、再算加减,有小括号先算小括号。

数字之间正常运算

        // 数字之间的运算

        console.log(3 + 7); //10
        console.log(3 - 7); //-4
        console.log(3 * 7); //21
        console.log(3 / 7); //0.42857142857142855
        console.log(3 % 7); //3
        console.log(9 % 7); //2
        console.log(4 % 5); //4

非正常运算情况 1

  • 有特殊值字面量参与的运算。

  • NaN参与的运算:得到的结果都是NaN

        // NaN参与运算  

        console.log(NaN + 3); //NaN
        console.log(NaN - 3); //NaN
        console.log(NaN * 3); //NaN
        console.log(NaN / 3); //NaN
        console.log(NaN % 3); //NaN
  • Infinity参与的运算,视情况而定
        //Infinity 参与运算

        console.log(Infinity + 3); //Infinity
        console.log(Infinity - 3); //Infinity
        console.log(Infinity * 3); //Infinity
        console.log(Infinity / 3); //Infinity
        console.log(Infinity % 3); //NaN
        //
        onsole.log(-Infinity + 3); //-Infinity
        console.log(-Infinity - 3); //-Infinity
        console.log(-Infinity * 3); //-Infinity
        console.log(-Infinity / 3); //-Infinity
        console.log(-Infinity % 3); // NaN
        //
        console.log(3 / Infinity); // 0
        console.log(3 % Infinity); // 3
        //
        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
  • 工作中并不会使用特殊值运算,没有实际应用的意义,但是要了解,以防 面试遇到。

非正常运算情况 2

  • 其他类型的数据参与数学运算。

  • 有字符串参与的 + 运算:+ 号变为连字符将前后连接成整体字符串。

        //数字和字符串之间运算,加号+作为连接符运算结果为字符串;其他运算符号运算结果为number
        //字符串参与                    //输出类型
        console.log(1 + "1"); // 11     // string
        console.log(1 - "1"); // 0      // number
        console.log(1 * "1"); // 1      // number
        console.log(1 / "1"); // 1      // number
        console.log(1 % "1"); // 0      // number
        // 
        console.log(1 + "     "); // 1          // string
        console.log(1 - " "); // 1              // number
        console.log(1 * " "); // 0              // number
        console.log(1 / "   "); // Infinity     // number
        console.log(1 % " "); // NaN            // number
  • 隐式转换:除了字符串参与的 + 运算,其他情况下,所有其他数据类型参与数学运算时,计算机暗中将其他数据类型先自动转换成数字类型,再参与运算,这个过程中需要使用parseInt()、Number() 等方法,过程是暗中进行,这就是一个隐式转换的过程

    • 隐式转换
      其他的数据类型会隐式转换为数字类型:
        - 对应数字:纯数字字符串会转为对应的数字`“123”``123`

        - 转换为1`true`  

        - 转换为0`false``null`、“”`空字符串``空白字符串`

        - 转换为NaN`undefined``非空非纯数字字符串`  
                //其他数据类型参与运算
         console.log(1 + true); // 2 
         console.log(1 + false); // 1
         console.log(1 + undefined); // NaN
         console.log(1 + null); // 1  

比较运算符

也叫作关系运算符。一个 比较运算符 comparison operator 比较它的操作数并返回一个布尔类型值。运算结果要么是true,要么是false

比较运算符有:

字符说明
>大于
<小于
>=大于等于
<=小于等于
==相等 只判断值大小是否相等不判断数据类型
!=不等 与相等完全相反
===全等 不光判断值相等还要判断数据类型相等
!==不全等 与全等于完全相反

正常情况运算:

数字与数字之间运算

        // 数字与数字
        console.log(6 > 8); // false
        console.log(6 < 8); // true
        console.log(6 <= 8); // true
        console.log(6 >= 8); // false
        console.log(6 == 8); // false
        console.log(6 != 8); // true
        console.log(6 === 8); // false
        console.log(6 !== 8); // true

非正常运算情况 1

  • 特殊值参与比较运算。

  • NaN参与:不等于和不全等于结果是 true,其他的都得到 false

        // `NaN 参与比较,不完全等于就是true`
        console.log(NaN > 8); // false
        console.log(NaN < 8); // false
        console.log(NaN <= 8); // false
        console.log(NaN >= 8); // false
        console.log(NaN == 8); // false
        console.log(NaN != 8); // true
        console.log(NaN === 8); // false
        console.log(NaN !== 8); // true   

        onsole.log(NaN > NaN); // false
        console.log(NaN < NaN); // false
        console.log(NaN <= NaN); // false
        console.log(NaN >= NaN); // false
        console.log(NaN == NaN); // false
        console.log(NaN != NaN); // true
        console.log(NaN === NaN); // false
        console.log(NaN !== NaN); // true
  • Infinity参与的运算,视情况而定
        // `Infinity 参与比较`
        console.log(Infinity > 8); // true
        console.log(Infinity < 8); // false
        console.log(Infinity <= 8); // false
        console.log(Infinity >= 8); // true
        console.log(Infinity == 8); // false
        console.log(Infinity != 8); // true
        console.log(Infinity === 8); // false
        console.log(Infinity !== 8); // true

        console.log(Infinity > Infinity); // false
        console.log(Infinity < Infinity); // false
        console.log(Infinity <= Infinity); // true
        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  
        true1  
        false0  
        null0  
        undefinedNaN  
        ""0  
        "abc"NaN  
  • null 的判断比较特殊:null 与 0 判断时,相等判断为 false,>= 和 <= 判断为 true

  • null == undefined

        console.log(1 == "1"); // true
        console.log(1 == true); // true
        console.log(1 == false); // false
        console.log(1 == ""); // false
        console.log(1 == "    "); // false
        console.log(1 == undefined); // false
        console.log(1 == null); // false
        console.log(1 > null); // true
        console.log(1 >= null); // true
        console.log(1 <= null); // false
        console.log(undefined == null); // true

非正常运算情况 3

  • 字符串与字符串比较。

  • 不会发生隐式转换为数字,而是比较两个字符串的 Unicode 编码顺序。

  • 字符编码顺序:从前往后 0-9,A-Z,a-z,前面的小于后面的。

  • 比较时,不关心两个字符串的长度,从第一个字符开始比较,依次往后顺延比较,直到比较出大小,就不再往后比较

        // 字符串之间比较
        console.log(3 < "7"); // true
        console.log("3" < "17"); // false
        console.log("3" < "37"); // true
        console.log("3" < "47"); // true
        console.log("3" < "3"); // false
        console.log("3" < "a"); // true
        console.log("A" < "a"); // true
        console.log("A" < "0a"); // false
        console.log("Z" < "a"); // true
        console.log("9Z" < "a"); // true

        // 比较顺序,从前往后比较,前面先得出结果再参与后面的比较
        console.log(3 > 2 > 1);  // false  3 > 2 为true,1为true,所以true>true为false。

逻辑运算符

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

&& - 逻辑与运算符。且的意思,符号两边同时满足条件时返回值才为true,反之false。

|| - 逻辑或运算符。或表示满足符号两边其中一个条件就为true,反之false。

! - 逻辑非运算符。非真既假,取相反值得意思。

非正常情况比较

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

  • 并不是所有逻辑运算返回结果都是布尔值,其他数据参与得到的就是数据本身。

隐式转换为布尔值的规律

  • 转为false:NaN、0、“”空字符串、null、undefined

  • 转为true:非0 非NaN数字、非空字符串

  • 当它们用于非布尔值的时候,返回值就可能是非布尔值。其实这种运算非常简单,就两句话:

(逻辑与 a && b ) 如果a能被转换为false,那么返回a;否则,返回b。

(逻辑或 a || b ) 如果a能被转换为true,那么返回a;否则,返回b。

逻辑运算符运算顺序

  • 同种运算符从前往后运算。

  • 综合运算顺序:非、与、或。

赋值运算符

一元运算符

运算优先级