操作符
概念: 操作符也叫作运算符
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
true → 1
false → 0
null → 0
undefined → NaN
"" → 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。
逻辑运算符运算顺序
-
同种运算符从前往后运算。
-
综合运算顺序:非、与、或。