5+3 //其中'5+3'是表达式,'5'和'3'是操作数,'+'是运算符
算术表达式
+
-
*
/
% 取余(求模)
算术运算的顺序
乘、除、取余——加、减
用圆括号可改变运算顺序
注:加号有两种作用
- 两边操作数都是数字,则是加法
- 两边操作数存在字符串(不都是数字),则是连字符
幂 开根号
JavaScript未提供幂、开根号的运算符
需使用Math对象的方法进行计算
Math.pow(2, 3) //8
Math.pow(2, -2) //0.25
Math.sqrt(81) //9
Math.sqrt(-81) //NaN
内置构造函数后面会讲,此处了解即可!
向上取整 向下取整
Math.ceil(2.4) //3
Math.floor(2.4) //2
Math.ceil(-2.4) //-2
Math.floor(-2.4) //-3
IEEE754二进制浮点数算术标准
是计算机底层编译标准
在JavaScript中,使用IEEE754个别小数的运算会“丢失精度”
0.1 + 0.2 //0.30000000000000004
0.3 + 0.4 //0.7
如何解决?
通过调用toFixed()保留指定的小数位数
(0.1 + 0.2).toFixed(2) //'0.30'
Number((0.1 + 0.2).toFixed(2)) //0.3
关系表达式
>
<
>=
<=
==
===
!=
!==
关系运算的结果是布尔值
关系运算的顺序
无特定顺序,从左到右
相等和全等
==
比较值但不比较值的类型;
===
比较值也比较值的类型/地址
3 = 3 //错误语句
3 == '3' //true
3 === '3' //false
1 == true// true
1 === true //false
0 == false // true
0 === false //false
0 == undefined //false
0 === undefined //false
Undefined和null判等
undefined == null // true
undefined === null // false
原因在于
typeof null //object
typeof undefined //undefined
注:实际上,undefined值派生自null值
ECMAScript标准规定对undefined和null进行相等性测试要返回true
NaN不自等
NaN和undefined判等
NaN和null判等
NaN == NaN //false
NaN === NaN //false
NaN == undefined //false
NaN === undefined //false
NAN == null //true
NAN === null //false
不相等和不全等
5 != 6 //true
5 !== 6 //true
5 != '5' //false
5 !== '5' //true
JS中不能连比
3<=a<=15//错误写法
逻辑表达式
&&:1101 & 0100,结果是0100,两串联开关,同时关闭电路才通
||:1101 | 0100,结果是1101,两并联开关,同时断开电路才断
!:逻辑取反, false变true,true变false
注:~是按位取反,二进制0变1,1变0
&&
||
!
逻辑运算的结果是布尔值
逻辑运算的顺序
非——与——或
短路运算&&、||
a&&b
a真,表达式值为b;
a假,表达式值为a
原理:
若a真,b真,总结果就真;b假,总结果就假
若a假,不用看b,总结果为假,b被短路
3 && 6 //6
- 15 && undefined//undefined
' ' && 16 //16
'mukewang' && 16 //16
true && 16 //16
undefined && 15 //undefined
0 && 2 //0
false && 3 //false
null && 2 //null
'' && 16 //''
NaN && undefined //NaN
a||b
a真,表达式值为a;
a假,表达式值为b
原理:
若a真,不用看b,总结果为真,b被短路
若a假,b真,总结果就真;b假,总结果就假
应用:
设置函数的默认参数
非运算!
也可称为“置反运算"
属“单目运算符",只需要一个操作数
!ture //false
!false //true
!0 //true
!undefined //true
!'' //true
!'imooc' //false
特别地,两次取反!!
!!true //true
!!0 //false
!!'' //false
!!'imooc' //true
赋值表达式
区分:
=
将等号右边的值,赋予等号左边的变量
==
比较值但不比较值的类型
===
比较值也比较值的类型/地址
赋值运算的顺序
自增、自减——赋值、快捷运算
赋值运算有返回值
等号后面的值将作为“赋值运算的返回值”
var a;
console.log(a = 4);//4,其中a=4是有返回值的,为4
意味着,可连续使用赋值运算符
var a, b, c;
a = b = c = 15;
console.log(a);//15
console.log(b);//15
console.log(c);//15
与算术运算符结合形成快捷运算符
+=
-=
*=
/=
%=
与自增/自减运算符配合使用
a++
a--
a++和++a的区别
a++先用再加
++a先加再用
var a = 3;
var b = a++;
console.log(b);//3
console.log(a);//4
对比
var a = 3;
var b = ++a;
console.log(b);//4
console.log(a);//4
面试题:
var a = 3;
var b = 4;
console.log(a++ + b++ + ++a + ++b);//3+4+5+6=18
综合表达式
综合运算的顺序
非——算术——关系——(除过非运算的)其他逻辑运算
!13 < 5 - 3 && 3 > 2 //true
解析:
1.非,13是真值, 故!13为false
2.数,5 - 3=2
3.关,Number(false)为0,0 < 2, 结果为ture;3 > 2结果为true
4.逻,true && true 结果为true
应用1-判断变量范围
问题:验证变量a是否介于5到12之间?
1.错误写法: 5 <= a <= 12
解析:
关系运算符优先级相同,从左到右验证
假设a=1,5<=1结果为false,Number(false)为0,0<=12结果为true,故最终结果为true
假设a=100,5<=100结果为true,Number(true)为1,1<=12结果为true,故最终结果为true
综上,连等达不到效果
3.正确写法: a >= 5 && a <= 12
应用2-判断闰年
公历闰年的简单计算方法(符合以下条件之一即可)
1.能被4整除且不能被100整除。
2.能被100整除也能被400整除。
var year = Number(prompt('请输入要判断的年份'));// prompt(text,defaultText)其返回值是字符串类型
alert(year % 4 == 0 && year % 100 != 0 || year % 100 == 0 && year % 400 == 0);
表达式运算顺序的总结
表达式类型 | 顺序 |
---|---|
算数 | 乘、除、取余——加、减 |
关系 | 无 |
逻辑 | 非——与——或 |
赋值 | 自增、自减——赋值、快捷运算 |
综合 | 非——算术——关系——(除过非运算的)其他逻辑运算 |
真假值
何处存在真假值判断
1.条件语句 if、else if
2.循环语句 switch、while、for
3.逻辑运算 && 、|| 、!
真假值判断原则
js中,一般认为有内容或存在的(值或对象,0除外)进行判断时就是真值;
而没有内容或不存在的(“”,undefined,null等等)进行判断时就是假值
常见的真值
所有非0数字(不限于正数、负数、小数)
所有非空字符串(注:空格字符串也为真)
true
函数
能找到的元素
[](注:空数组也为真)
{}(注:空对象也为真)
常见的假值
0、NaN、null、undefined
空字符串
false
不能找到的元素
隐式类型转换
为何需要?当运算符两边数据不统一,CPU无法计算
定义:由编译器自动转换的方式就称为~
转为Number,调用的是Number()
适用情况:算术/关系运算时
1)算术运算符 + - * / %
2)关系运算符 > < >= <= == === != !===
3)自增自减运算符 ++ --
特别地
复杂(引用)数据类型是先转为String再转为Number
转成String
适用情况:使用连接符+时
转成Boolean
适用情况:需要真假值判断时
1)条件语句 if、else if
2)循环语句 switch、while、for
3)逻辑运算 && 、|| 、!