加减乘除和比较赋值
显式类型转换
String() Number() Boolean() Object()
隐式类型转换
乘性操作符
都是数字进行数字运算,有一个不是数字就转换为数字进行运算,如果不能转换为数字就会被转为NaN。
- 乘法
- 除法
- 求模
- 减法
注意:
- 涉及到小数时,也不精确。
- 求模运算结果不一定是整数,也可以是小数。
加性操作符
减法
如果两个都是数字就进行数字运算,如果不是就转换为数字就行运算。不能转换为数字的为NaN。涉及到小数的也不精确。
加法(偏向字符串拼接)
两个数字或布尔值相加
两边都是数字或者布尔类型,布尔会转化为数字,然后相加。
两个字符串拼接
有一个为字符串就会将另外一个转化为字符串然后拼接。
123 + true //124 "sdfa" + false //"sdfafalse" {}+{} //"[object Object][object Object]" undefined + null //NaN [] + [] // ''
不确定运算过程是如何转化的就先进行数据类型转换,再进行相加。
关系操作符
关系运算符(偏向于数字)
小于(<) 、大于(>) 、小于等于(<=)和大于等于(>=)
数字比较
字符串比较,字符串比较本质是对字符串编码进行比较。
对象比较,将对象转化原始值,先valueOf()后toString()。
如果有一个是数值就把另外一个也转化为数字类型
如果有一个NaN 结果为false,NaN不等于任何值。
关系运算符返回值一定是布尔值。
关系运算符是二元运算符,从左向右计算。
7>6>5 //false //true > 5 //1 > 5
结论
加法运算和比较运算都会进行隐式转换。加法运算偏向字符串处理,比较运算偏向数字比较。
建议
不确定先进行显示转换再比较
相等操作符
判断 == === != !==
=== 全等,
- 先进行数据类型比较
- 数字 比较数值 NaN跟谁都不相等
- 字符串 判断字符串编码。看着相等不一定相等
- 布尔类型
- null 和 undefind 只和自身相等
- 对象 比较的是对象的引用
- 先进行数据类型比较
== 相等
会进行隐式类型转换
null 和 undefind 相等
数字、字符串和布尔 进行混合运算时,先转化为数字再比较
字符串 和 布尔比较,都转化为数字比较
'1' == true //true
对象 比较的是对象的引用
对象跟原始类型比较,先把对象转化为原始类型,先valueOf()后toString()
赋值 =
是二元操作符,有左右两个表达式就行运算。
赋值运算左侧表达式必须是一个变量或者是对象的某一个属性。
赋值运算左侧的表达式是一个可以改变的东西,可以改变的值称做左值
右边的表达式可以是任何数据类型。
var num = 10; num = num + 10; // =优先级最低,所以先num + 10 得到20 然后赋值给num var age = 29; age++; //age = age + 1
复合赋值(带操作符的赋值)
var num = 10; num += 10;
只是写法改变性能没有提升。
乘/赋值(*=); 除/赋值(/=); 模/赋值(%=); 加/赋值(+=); 减/赋值(=); 左移/赋值(<<=); 有符号右移/赋值(>>=);
操作符都可以连续操作
//连续赋值问题 var a = b =1 //b会成为全局变量
+特殊操作
有一个是字符串,另外一个转换为字符串
有undefind、null 、布尔、数字这四种类型混合运算,都会被转为数字然后相加
undefind + undefind //NaN null + null //0
对象到原始值的转换(不确定是数字还是字符串)
复习对象到字符串和数字转换
对象到字符串
先toString()后valueOf()
对象到数字
先valueOf() 后toString()
两个对象相加,不知道结果会是数字或者字符串,就成了对象到原始值的转换
先valueOf() 后toString() 。特殊的Date对象到原始值,直接toString()
[]+[] // '' //[].valueOf()>[] //[].toString() "" 1+[1,2] //"11,2" // [1,2].valueOf() > [1, 2] // [1, 2].toString() > "1,2" // 1+"1,2" > "11,2" 1+{a: 1} //"1[object Object]" // {a: 1}的valueOf() >{a:1} // a.toString() > "[object Object]" // 1+"[object Object]" > "1[object Object]" {a: 1} +1 //1 //js中 {} 除了表示对象外,还表示一个代码区域。 // 实际解析如下: {a: 1} +1 // 返回 +1 的值 1。二元加操作符变成了一元加操作符 {}+{} //NaN 测试为"[object Object][object Object]" // 理论解析如下: {} +{} // +{} >NaN 对象进行一元加操作,即将对象转化为数字Number({}) var a ={} a+a //不换行 "[object Object][object Object]" ({})+{} //不换行 "[object Object][object Object]" []+{} //"[object Object]" //[].valueOf(); [].toString() > "" {}+[] //0 //换行 {} +[] // +[] > 0
比较==的特殊操作
js的解释器当中== 的转换规则比较复杂
首先判断左右两侧操作数的数据类型是否相同。
如果相同的数据类型 == 和 ===相同
数据类型不相同时:
- 如果是 null 和 undefined 返回true
- 数字、字符串和布尔类型,先转换为数字再进行比较
- 操作数中存在对象,先把对象转化为原始值,再和另外的操作数进行比较
- 如果上述条件都不满足返回false
null == false //false
undefined == false //false