5.判断运算与逻辑运算通用规则与运算符优先级及其注意事项
表达式中变量求值规则
无论结合性和优先级如何,求值顺序总是从左到右。
运算符优先级
. () [] new ?. fn() |
+... -... 前置递增递减 |
/ % |
+ - |
&& |
|| |
三元表达式 |
= |
, |
运算符比较注意:
- 基本包装类型会先转成包装对象再进行比较
- 因为引用数据类型和基本包装类型(Number,String,Boolean)比较或运算时先调用valueOf()有原始值则用原始值参与比较,如果没有原始值会调用toString()方法将自身转成字符串,因此其在进行与非字符串非引用数据类型比较或运算时都是转换为NaN
运算符注意:
连等赋值时的特殊情况
var a=b=10;
//相当于以下代码
b=10;
var a=b;
属性的赋值优先级比变量高(连等的情况下)
var a = { //a=0x100
n: 1
};
var b = a; //b=0x100
a.f = a = { //0x100.f=0x200; a=0x200;
n: 2
};
//相当于以下代码
// a.f = {n:2}; //0x100.f=0x200;
// a = a.f; //a=0x100.f=0x200;
console.log(a); //0x200={n:2}
console.log(a.f); //0x200.f=undefined
console.log(b.f); //0x100.f={n:2}
逻辑运算符特殊情况
[] == ![]
{} == !{}
判等,先确定量变的数据类型,发现左侧是数组,右侧是 ![] -> 这个结果一定是一个布尔值
(!运算优先级非常高,![] -> !true -> false)
相当于 [] == false
两侧不是同种数据类型,左侧空数组调用valueOf返回自身,还是不能比,再掉toString()变成""
此时, "" == false, 转数字
0 == 0 -> true
逻辑运算符比较
&& 左侧为真,则以右侧式子的值为整个表达式的值,左侧为假,则以左侧式子的值为整个表达式的值,右侧不执行;
|| 左侧为真,则以左侧式子的值为整个表达式的值,右侧不执行;左侧为假,则以右侧式子的值为整个表达式的值;
! ,!后面跟的一定是一个布尔值,如果不是先转成布尔值,再执行! 的取反,引用数据类型取反一定为false
引用数据类型判断规则
先调用valueOf,有基本值就用基本值判断,没有基本值再调用toString然后再去判断
判断运算符规则
如果两边类型相等,则直接判断,如果两边类型不等,转换为数字
特殊情况:
-
null除了与undefined相等(不全等)外,都不相等
因为undefined派生自null -
NaN进行计算时都为NaN,进行判等与比较时都为false(包括NaN自己)
-
相加时
- 如果有字符串,则为拼接
- 如果有引用数据类型,则把引用数据类型按引用数据类型判断规则转换后再进行拼接
- 其他情况全部转数字再相加
-
比较时
- 如果两边都是字符串则比较字符串的Unicode码
- 如果有引用数据类型,则把引用数据类型按引用数据类型判断规则转换后再进行比较
- 其他情况全部转数字再比较
-
双等判断时
- 如果两边都是引用数据类型,比较的是地址
- 如果两边都是字符串,比较的是Unicode码
- 如果只有一边是引用数据类型,则把引用数据类型按引用数据类型判断规则转换后再比较
- 其他情况全部转数字
1 == true; // true
1 === true; // false
== 是用来判值的,值相等就相等(它是可以发生隐式转化的)
=== 是类型和值都要判,必须类型和值都相等才全等;
toString、valueOf和原始值
在比较时,会先调用valueOf()如果有原始值,则返回原始值,没有原始值则调用toString()
都是显示原型上的方法 | 作用 |
---|---|
toString() | 数组转成以逗号分隔的字符串 函数把函数表达式原封不动的转成字符串 对象直接返回"[object Object]" 包装对象把原始值[[PrimitiveValue]]转成了字符串 |
valueOf() | 对象在调用valueOf的时候,如果有原始值[[PrimitiveValue]],就返回原始值,如果没有,就返回对象本身(只有包装对象有原始值) |
数组转换注意:
[1,{}]转换为"1,[object Object]"
番外之运算符
算数运算符
+ - * / %
%有什么作用?
求一个范围 eg: 275% 25 -> 0-24
求一个数上每一位的值
判断个数能否被另一个数整除
自增自减运算符
a 和 a++ 是两个东西,a代表变量 ,a++代表表达式,他们两个都是有值的
++在后,先把变量的值赋值给表达式,再让变量+1;
++在前,先变量+1,再把变量的值赋值给表达式;
赋值运算符
=
+= -= *= /= %= 复合赋值运算符
比较(条件)运算符 和 表达式
> < >= <= == != === !==
比较运算符和表达式;最终表达式的值都是布尔值;
逻辑运算符(与或非)
&& 与 || 或 ! 非
多个条件表达式的连接的时候,两边都是条件表达式才能使用。
1、一般规则
与&& 两侧为真则为真
或|| 一侧为真则为真
非 ! 取反
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现