01、运算符的定义和分类
运算符也叫操作符。通过运算符可以对一个或多 个值进行运算,并获取运算结果。
比如: typeof
就是运算符,可以来获得一个值的类型。 它会将该值的类型以字符串的形式返回: number、string、boolean、undefined、object
注:运算符都是会返回结果的,而typeof这个运算符返回的结果就是变量的类型。那返回的结果的类型是什么呢?
是字符串。
运算符有很多分类,比如:
- 算数运算符
- 自增运算符
- 逻辑运算符
- 赋值运算符
- 关系运算符
- 三元运算符(条件运算符)
02、算术运算符
常见的算术运算符有以下几种:
+ | 加、字符串连接 |
---|---|
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
( ) | 括号 优先级 |
求余例子:
假设用户输入345,怎么分别得到3、4、5这三个数呢?
代码如下:
得到3的方法: 345除以100,得到3.45然后取整,得到3。即: parseInt (345/100)
得到4的方法: 345除以100,余数是45,除以10,得到4.5,取整。即: parseInt(345 % 100 / 10)
得到5的方法: 345除以10,余数就是5。即: 345 % 10
算术运算符的运算规则
- 先乘除,后加减
- 小括号:能够影响计算顺序,且可以嵌套。先算括号里面的,如有嵌套先算嵌套括号里面的,没有中括号,没有大括号,只有小括号。
- 百分号:取余
例1(取余):
console.log(3 % 5);// 输出结果3
例2(注意算术符优先级):
/*
1. 1+6%4/2
2. 1+2/2
3. 1+1
4. 得到结果 a = 2
*/
var a = 1 + 2 * 3 % 4 / 2;
算术运算符的注意事项
-
当对非Number类型的值进行运算(包括
+
、-
、*
、/
)时,会将这些值转换为Number然后再运算。(PS:字符串+ Number
、字符串+字符串
是特例,字符串无论+
什么都是字符串,详情看下文)比如:
var result = true + 1 // 等同 1 + 1 var result2 = true + false // 等同 1 + 0 var result3 = 1 + null // 等同1 + 0 var result4 = 100 - '1' // 等同 100 - 1
-
任何值与NaN做运算的结果都是NaN
-
任何的值和字符串做加法运算,都会先转换为字符串,然后再做拼串操作
比如:
var a = 1 + 2 + '3' //结果33 var b = '1' + 2 + 3 //结果123
我们可以利用这一特点,来将一个任意的数据类型转换为String :我们只需要为任意的数据类型
+
一个""即可将其转换为String。这是一种隐式的类型转换,由浏览器自动完成,实际上它也是调用String()函数。也就是说,c =c + ""
等价于c=String(c)
。 -
任何值做
+
、-
、*
、/
运算时都会自动转换为Number我们可以利用这一特点,为一个值
-0
、*1
、/1
来将其转换为Number。原理和Number()函数一样。使用起来更加简单。
03、乘方
如果想计算a的b次方
,可以使用以下函数:(Math的中文是"数学”,pow是"power幂")
Math.pow(a,b);
例1:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eb7hzqzp-1664598415821)(D:\文档\js文档\文档图片\wps1.jpg)]
代码如下:
Math.pow(3,Math.pow(2,2));
例2:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bojbhAD7-1664598415822)(D:\文档\js文档\文档图片\wps2.jpg)]
Math.pow(Math.pow(3,2),4);
04、开方
如果想计算数值a的开2次方,可以使用以下函数,sqrt即"square开方":
Math.sqrt(a);
05、一元运算符
一元运算符,只需要一个操作数。
常见的一元运算符如下:
-
typeof
typeof就是典型的一元运算符。因为后面只跟一个操作数。
如:
var a = "123" console.log(typeof a) // 输出string
-
正号
+
-
正号不会对数字产生任何影响。比如说,2和+2是一样的。
-
我们可以对一个其他的数据类型使用+ ,来将其转换为number 。比如:
var a = true a = +a console.log(a) // 输出1 console.log(typeof a) // 输出number var b = '12' b = +b console.log(b) // 输出12 console.log(typeof b) // 输出number
-
-
负号
-
负号可以对数字进行取反
06、自增与自减
自增++
自增分为两种:a++
与++a
-
对于一个变量自增以后,原变量的值会立即自增1。也就是说,无论是
a++
还是++a
,都会立即使原变量的值自增1。 -
要注意的是:a是变量,而
a++
与++a
是表达式那这两种自增,有啥区别呢?
区别是:
a++
和++a
的值不同: (也就是说,表达式的值不同)- a++的值等于原变量的值( a自增前的值)
- ++a的值等于新值( a自增后的值)
自减–
原理同上
07、逻辑运算符
逻辑运算符有三个:
&&
与(且):两个都为真,结果才为真||
或:只要有一个为真,结果就为真!
非:对一个布尔值进行取反
连比的写法:
例1:
console.log(3 < 2 && 2 < 4) // 输出false
例2:
判断一个人的年龄是否在16-24之间:
var a = prompt("请输入年龄:")
alert(a >= 16 && a <= 24)
PS :上面的这个a>=18 && a<= 65
千万别想当然的写成18<= a <= 65
, 没有这种语法。
注意事项
-
能参加逻辑运算的都是布尔值
-
JS中的
&&
属于短路的与,也就是说只要第一个值为false,则不会看第二个值 -
JS中的
||
属于短路的或,也就是说只要第一个值为true,则不会看第二个值 -
如果对非布尔值进行逻辑运算,则会先将其转换为布尔值,然后再操作。如:
var a = 10; a = !a // 任何非零的数值转换为布尔值都是true console.log(a) //输出false
非布尔值的与或运算【重要】
非布尔值进行与或运算时,会先将其转换为布尔值,然后再运算,但返回结果是原值。比如:
var a = 5 && 6 // true && true
console.log(a) // 输出 6 返回最后面的那个值
var b = 5 && 0 && 6 // true && false && true
console.log(b) // 输出 0 因为与运算在0这发生短路,不会进行后面的运算
var c = 5 || 6 // true || true
console.log(a) // 输出 5 因为或运算在5这发生短路,不会进行后面的运算
var d = 0 || 6 // false || true
console.log(b) // 输出 6 因为或运算是只要有一个为true就为true,而第一个值为false,所以继续进行后面的运算
08、赋值运算符
可以将符号右侧的值赋值给符号左侧的变量。
+=
,a+=5
等价于a=a+5
-=
,a-=5
等价于a=a-5
*=
,a*=5
等价于a=a*5
/=
,a/=5
等价于a=a/5
%=
,a%=5
等价于a=a%5
09、关系运算符
通过关系运算符可以比较两个值之间的大小关系,如果关系成立它会返回true,如果关系不成立则返回false.
关系运算符有很多种,比如:
> 大于号
< 小于号
>= 大于等于号
<= 小于等于号
== 等于 在JavaScript中会进行隐式的类型转换,如果转换后的内容相等,那么就为true
=== 全等于 不会进行隐式的类型转换
!= 不等于
!== 不全等于
关系运算符,得到的结果都是布尔值:要么是true ,要么是false。
如:
var a = 5 > 10 //false
console.log(a) // 输出 false
非数值的比较
-
对于非数值进行比较时,会将其转换为数字然后再比较。
例子:
console.1og(1 > true); //false console.log(1 >= true); //true console.1og(1 > "0"); //true //console.1og(10 > nu11); //true //任何值和NaN做任何比较都是false console.log(10 <= "hello"); //false console.log(true > false); //true
-
特殊情况:如果符号两侧的值都是字符串时,不会将其转换为数字进行比较。比较两个字符串时,比较的是字符串的Unicode编码。[非常重要 ,这里是个大坑]
比较字符编码时,是一位一位进行比较。如果两位一样,则比较下一位,所以借用它可以来对英文进行排序。
PS :所以说,当你尝试去比较"123"和"56"这两个字符串时,你会发现,字符串"56’竟然比字符串"123"要大。也就是说,下面这样代码的打印结果,其实是true: (这个我们一定要注意,在日常开发中,很容易忽视)
// 比较两个字符串时,比较的是字符串的字符编码 console.log("56" > "123") // 输出true
因此:当我们在比较两个字符串型的数字时,一定一定要先转型,比如
parseInt()
。 -
任何值和NaN作比较都是false
==
符号的强调
注意==
这个符号是判断是否等于,而不是赋值
-
==
这个符号还可以验证字符串是否相同,例如:console.log("你好呀" == "你好呀") // 输出true
-
==
这个符号并不严谨,会将不同类型的东西,转化为相同类型进行比较(大部分情况下都是转换为数字)。如:console. 1og("6" == 6); // 输出true。 这里的字符串"6"会先转换为数字6,然后再进行比较 console. log(true == "1"); // 输出 true console.1og(0 == -0); // 输出true console. log(nu11 == 0); // 输出false
-
undefined衍生自null,所以这两个值做相等判断时,会返回true
console.log(undefined == null) // 输出true
-
NaN不和任何值相等,包括他本身
console.log(NaN == NaN) // 输出false
那么如果想判断某个值是否为NaN怎么判断呢?
这时我们可以通过
isNaN()
函数来判断一个值是否为NaN,如:var a = 12 console.log(isNaN(a)) // 输出false 如果a为NaN,则输出true,如果a不是NaN,则输出false
===
符号的强调如果要保证完全等于,我们就要用三个等号
===
。全等不会做类型转换。例如:console.1og("6" === 6); //false console.1og(6 === 6); //true
由以上可知:
==
两个等号并不严谨,6和"6"是true===
三个等号严谨,6和"6"是false
另外
==
的反面是!=
,===
的反面是!==
,如:console.1og(3 != 8); //true console.1og(3 != "3"); //false, 因为3=="3"是true,所以反过来就是false。 console.1og(3 !== "3"); //true, 应为3==="3"是false,所以反过来是true。
10、三元运算符
三元运算符也叫条件运算符
语法:
条件表达式?语句1:语句2 // 为true执行语句1,为false执行语句2
执行流程
条件运算符在执行时,首先对条件表达式进行求值:
- 如果该值为true,则执行语句1,并返回执行结果
- 如果该值为false,则执行语句2,并返回执行结果
如果条件的表达式的求值结果是一个非布尔值 ,会将其转换为布尔值然后再运算。
11、运算符的优先级
运算符的优先级如下:(越往上,优先级越高)