5.判断运算与逻辑运算通用规则与运算符优先级及其注意事项

表达式中变量求值规则

无论结合性和优先级如何,求值顺序总是从左到右。

运算符优先级

. () [] new ?. fn()
+... -... 前置递增递减
/ %
+ -
&&
||
三元表达式
=
,

运算符比较注意:

  1. 基本包装类型会先转成包装对象再进行比较
  2. 因为引用数据类型和基本包装类型(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、一般规则

与&& 两侧为真则为真

或|| 一侧为真则为真

非 ! 取反

posted @   听风小弟  阅读(349)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示