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、一般规则
与&& 两侧为真则为真
或|| 一侧为真则为真
非 ! 取反