一、数据类型转换
1.强制类型转换
1.转字符串:2种方式
var str=xx.toString();//null和undefined不能使用,如果使用则会报错
var str=String(xx);
2.转数字:3种方式
var num=parseInt(str/num);//(整数,不认识小数点)从左向右一次读取每一位字符,碰到第一个不是数字的就停下来,如果第一个字符不是数字,则为NaN
var num=parseFloat(str);//(认识第一位小数点)几乎和parseInt一样
以上两种方式可以去掉单位
Nunber(xx);万能,等效于隐式转换
3.转布尔
Boolean(xx);//万能,等效于隐式转换
以下6种情况为false: 0、" "、NaN、undefined、null、false(其余全部为true)
2.隐式类型转换(一般出现在运算符和表达式中)
二、运算符和表达式
1.算术运算: + - * / %
隐式转换:默认转为数字再运算
特殊:1. + 运算,只要碰到字符串,则变为拼接
2. - * / %,纯数字组成的字符串,也可以转为数字,但是非纯数字的字符串转为NaN (NaN参与任何的算术运算结果仍为NaN)
2.比较运算:> < >= <= == != === !==
结果:布尔值
隐式转换:默认,左右两边转为数字,再比较
特殊:1、如果左右两边参与比较的都是字符串,则是按位PK每个字符的十六进制unicode号(也称之为十进制ascii码)
数字 < 大写 < 小写 < 汉字 - 中间可能还一些特殊符号
2、NaN参与任何比较运算结果都为false
解决:判断是不是NaN
!isNaN(x); -- true是数字 false是NaN
3、undefined == null; -- 结果:true,区分不开
解决:=== 全等,要求数据类型要相同,并且数值也要相同
3.逻辑运算
&&:一假则假(只要一个为false,最后则为false)
||:一真则真(只要一个为true,最后则为true)
!:颠倒布尔值
隐式转换:悄悄把每一个条件都转为一个布尔值过后,再来进行综合比较
特殊:
短路逻辑:只要前一个条件已经可以得出最后结论,则后续条件不需要在执行!
&&:如果前一个条件为true,则后一个操作才会执行
如果前一个条件为false,则后一个操作不会执行
固定套路:简化了 简单的(操作只能有一句话)分支 if(){}
公式:条件&&(操作);
比如:if(total>=500){total*=0.8;};
简化:total>=500&&(total*=0.8);
总结:简化了简单的分支if(){},但是操作只能写一句话,如果操作有多句还是使用if结构
||:如果前一个条件为true,则后一个条件不在执行
如果前一个条件为false,则后一个条件才会执行
固定套路:实现两个值二选一使用 -- 备选值、做老IE兼容
var 变量=值1||值2;
4、位运算:
左移:m<<n,读作m左移了n位,相当于:m*2的n次方
右移:m>>n,读作m右移了n位,相当于:m/2的n次方
5、赋值运算:一句话执行两个操作,先运算,再保存回去
+= -= *= /= %=
何时使用:只要取出变量中的值,做计算,之后再保存回去时,就必须使用赋值运算
比如:total*=0.8; // total=total*0.8;
m+=n => m=m+n;//累加
m*=n => m=m*n;//累乘
递增和递减:
i++ => i+=1 => i=i+1;
i-- => i-=1 => i=i-1;
区别:递增递减每次只会操作1,如果你希望操作的数不是1,那么请使用累加/累减/累乘/累除
注:递增/减:1、单独使用,放前放后都一样
2、参与了其他表达式中,变量中的值都会被+1
前++,返回的是递增后的*新*值
后++,返回的是递增前的*旧*值
6、三目运算:简化分支:if(){}else{}、 if(){}else if(){}else{}
语法:
1、条件?操作1:默认操作; === if(){}else{}
条件满足做操作1,条件不满足做默认操作
2、条件1?操作1:条件2?操作2:默认操作; === if(){}else if(){}else{}
问题:1、只能简化简单的分支 -- 三目操作只能有一句
2、默认操作不能省略
总结:
if(){} == &&短路(操作只能是一句话)
if(){}else{} == 三目(操作只能是一句话)
if(){}else if(){}else{} == 三目(操作只能是一句话)