5.判断运算与逻辑运算通用规则与运算符
运算符优先级
优先级 | 运算符 | 关联性 | 顺序 |
---|---|---|---|
1 | 小括号 | () | |
2 | 非运算符 | 从左到右 | ! |
3 | 算数运算符 | 从左到右 | 先*/%后+- |
4 | 关系运算符 | 从左到右 | > >= < <= |
5 | 相等运算符 | 从左到右 | == != === !== |
6 | 逻辑运算符 | 从左到右 | && || |
7 | 三目运算符 | 从右到左 | ... ? ... : ... |
8 | 赋值运算符 | 从右到左 | =, +=, -=, *=, /=, %=, <<=(左移), >>=(右移),>>>=(无符号), &=, ^=, |= |
9 | 展开运算符 | ... | |
10 | 逗号运算符 | , |
运算符比较注意:
- 因为引用数据类型比较或运算时有原始值则用原始值参与比较,如果没有原始值会调用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
判断运算符比较
如果两边类型相等,则直接判断,如果两边类型不等,转换为数字
特殊情况:
-
null除了与undefined相等(也全等)外,都不相等
-
NaN进行计算时都为NaN,进行判等与比较时都为false(包括NaN自己)
-
相加时
- 如果有字符串,则为拼接
- 如果有引用数据类型,则引用数据类型调用toString()后再进行拼接
- 其他情况全部转数字再相加
-
比较时
- 如果两边都是字符串则比较字符串的Unicode码
- 如果有引用数据类型,则引用数据类型调用toString()后再进行比较
- 其他情况全部转数字再比较
-
双等判断时
- 如果两边都是引用数据类型,比较的是地址
- 如果两边都是字符串,比较的是Unicode码
- 如果只有一边是引用数据类型,则把引用数据类型调用toString()后再比较
- 其他情况全部转数字
1 == true; // true
1 === true; // false
== 是用来判值的,值相等就相等(它是可以发生隐式转化的)
=== 是类型和值都要判,必须类型和值都相等才全等;
toString、valueOf和原始值
都是显示原型上的方法 | 作用 |
---|---|
toString() | 数组转成以逗号分隔的字符串 函数把函数表达式原封不动的转成字符串 对象直接返回"[object Object]" 包装对象把原始值[[PrimitiveValue]]转成了字符串 |
valueOf() | 对象在调用valueOf的时候,如果有原始值[[PrimitiveValue]],就返回原始值,如果没有,就返回对象本身(只有包装对象有原始值) |
数组转换注意:
[1,{}]转换为"1,[object Object]"
番外之运算符
算数运算符
+ - * / %
%有什么作用?
求一个范围 eg: 275% 25 -> 0-24
求一个数上每一位的值
判断个数能否被另一个数整除
自增自减运算符
a 和 a++ 是两个东西,a代表变量 ,a++代表表达式,他们两个都是有值的
++在后,先把变量的值赋值给表达式,再让变量+1;
++在前,先变量+1,再把变量的值赋值给表达式;
赋值运算符
+= -= *= /= %= 复合赋值运算符
比较(条件)运算符 和 表达式
> < >= <= == != === !==
比较运算符和表达式;最终表达式的值都是布尔值;
逻辑运算符(与或非)
&& 与 || 或 ! 非
多个条件表达式的连接的时候,两边都是条件表达式才能使用。
1、一般规则
与&& 两侧为真则为真
或|| 一侧为真则为真
非 ! 取反