JS表达式与操作符

转载自:https://jerry-z-j-r.github.io/2021/08/06/JS-Cheat-Sheet-3/(来自 JERRY)


一、JS表达式与操作符

表达式:由操作数和运算符组成的式子。

表达式的分类:算术、关系、逻辑、赋值、综合。

二、算术表达式

2.1 算术运算符

意义运算符
+
-
*
/
取余%

推荐一律使用 () 来强制规定优先级!

  • + 有“加法”和“连字符”两种作用,如果 + 两边的操作数都是数字,则为“加法”,否则为“连字符”

2.2 隐式类型转换

如果参与数学运算的某操作数不是数字类型,那么 JS 会自动将此操作数转换为数字型。

3 * '4';		// 12
true + true;	// 2
false + 2;		// 2
3 * '2天'; 	   // NaN
3 + '2天'; 	   // '32天'
3 + null;		// 0
3 * '';			// 0
3 * ' ';		// 0
3 + '';			// '3'
3 + ' ';		// '3 '

隐式转换的本质是 JS 内部自动调用 Number() 函数

2.3 有关IEEE754

在 JS 中,有些小数的数学运算不是很精准。

0.1 + 0.2;	// 0.30000000000000004

JS 使用了 IEEE754 二进制浮点数算术标准,这会使一些个别的小数运算产生“丢失精度”问题。

注意:不是所有的小数运算都会出现精度问题,只是少数部分。

几乎所有的高级语言都使用了 IEEE754 二进制浮点数算术标准。

IEEE754 二进制浮点数算术标准是计算机底层编译标准,了解即可!

【解决办法】

在进行小数运算时,要调用数字的 toFixed() 方法保留指定的小数位数。

toFixed() 括号内接受一个保留小数位数的参数。

(0.1 + 0.2).toFixed(2);				// '0.30'
Number((0.1 + 0.2).toFixed(2));		// 0.3

toFixed() 遵循“四舍五入”原则。

(0.9945).toFixed(3);	// "0.995"

2.4 幂和开根号

JS 中没有提供幂运算、开根号的运算符。需要使用 Math 对象的相关方法进行计算。

Math.pow(a, b):求 a 的 b 次方。

Math.sqrt(a):求 a 的平方根。

Math.pow(2, 3);		// 8
Math.pow(3, 2);		// 9
Math.sqrt(81);		// 9
Math.sqrt(-81);		// NaN

2.5 向上取整和向下取整

Math.ceil():向上取整。

Math.floor():向下取整。

注意:向上、向下的标准是:X轴正方向为上!

负 ———— 0 ————> 正

Math.ceil(2.4);			// 3
Math.floor(2.4);		// 2

Math.ceil(-2.4);		// -2
Math.floor(-2.4);		// -3

Math.ceil(2);			// 2
Math.floor(2);			// 2		

三、关系表达式

3.1 关系运算符

意义运算符
大于>
小于<
大于或等于>=
小于或等于<=
等于==
不等于!=
全等于===
不全等于!==

3.2 相等和全等

两个等号 == 运算符不比较值的类型,它会进行隐式转换后比较值是否相等。

三个等号 === 运算符,不仅比较值是否相同,也比较类型是否相同。

5 == '5';		// true
5 === '5';		// false
1 == true;			// true
1 === true;			// false

0 == false;			// true
0 === false; 		// false

0 == undefined;		// false
0 === undefined;	// false

undefined == null;	// true
undefined === null;	// false

null 和 undefined 用 == 进行比较涉及隐式强制类型转换,ES5 规范中规定。

=== 比较为 false,是因为 null 与 undefined 类型不同。

3.3 NaN不自等

NaN 作为一个特殊的数字类型值,它在用 == 比较的时候也有特殊的结果。

NaN == NaN;			// false
NaN	=== NaN;		// false

【如何判断某变量值为 NaN】

isNaN() 函数可以用来判断变量值是否为 NaN。

isNaN(NaN);		// true
isNaN(5);		// false

但 isNaN() 也不好用,它的机理是:只要该变量传入 Number() 的执行结果是 NaN,则 isNaN() 函数都会得到 true。

isNaN(undefined);	// true
isNaN('3天');	   // true
isNaN(null);		// false

3.4 JS中没有连比

例如:3 <= a <= 15 的写法是错误的,应该为:a >= 3 && a <= 15。

四、逻辑表达式

4.1 逻辑运算符

意义运算符
!
&&
||

4.2 非运算

! 表示“非”,也可以称为“置反运算”。

! 是一个“单目运算符”,只需要一个操作数。

置反运算的结果一定是布尔值。

!true;			// false
!false;			// true
!0;				// true
!undefined;		// true
!'';			// true
!' ';			// false
!null;			// true
!'imooc';		// false

!! 常用于确定一个值的布尔属性。

!!true;		// true
!!0;		// false
!!'';		// false
!!' ';		// true
!!'imooc';	// true

4.3 与运算

&& 是“双目运算符”。

核心:全真为真、有假即假。

4.4 或运算

|| 是“双目运算符”。

核心:全假为假、有真即真。

4.5 短路运算

&& 与 ||,都属于“短路运算符”。

(1)&& 短路运算

由于 && 运算的核心是:“全真为真、有假即假”,所以:

  • 如果 a && b 中 a 为真,那么该表达式的值由 b 决定
  • 如果 a && b 中 a 为假,那么该表达式的值由 a 决定
3 && 6;				// 6
undefined && 15;	// undefined
15 && undefined;	// undefined
null && 2;			// null
'' && 16;			// ''
NaN && undefined;	// NaN

(2)|| 短路运算

由于 || 运算的核心是:“全假为假、有真即真”,所以:

  • 如果 a || b 中 a 为真,那么该表达式的值由 a 决定
  • 如果 a || b 中 a 为假,那么该表达式的值由 b 决定
3 || 6;				// 3
0 || 6;				// 6
null || undefined;	// undefined
'a' || 'b';			// 'a'
NaN || null;		// null

4.6 逻辑运算的优先级

优先级:! > && > ||

!true || true;		// true
3 && 4 || 5 && 6// 4

推荐使用 () 来规定优先级。

五、赋值表达式

5.1 赋值运算符

意义运算符
赋值=
快捷赋值+=、-=、*=、/=、%=
自增运算++
自减运算

5.2 赋值运算产生值

赋值运算也产生值,等号后面的值将作为“赋值运算的值”。

var a;
console.log(a = 4);		// 4

这就意味着,可以连续使用赋值运算符。

var a, b, c;
a = b = c = 15;
console.log(a);		// 15
console.log(b);		// 15
console.log(c); 	// 15

在实际开发中不建议使用连续赋值!

5.3 快捷赋值

快捷赋值运算符表示在“原数值”基础上进一步进行运算。

5.4 自增自减运算

a++:先用再加;++a:先加再用。

a–:先用再减;–a:先减再用。

六、综合运算的运算顺序

非运算 > 数学运算 > 关系运算 > 逻辑运算

建议使用 () 来规定优先级。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值