一、***数据类型转换
1、强制转换
1)、转字符串:var str=x.toString();//x不能是undefined和null - undefined和null不能使用.
var str=String(x);//万能的,完全等效于隐式转换,还不如+""
不重要:页面上一切数据的数据类型都是字符串
2)、*转数字:
①、*parseInt/Float(str);//专门为字符串转为数字准备的
原理:从左向右,依次读取每个字符,碰到非数字字符则停止,如果一来就不认识则为NaN
Int不认识小数点 Float认识第一个小数点
②、Number(x);//万能的,完全相当于隐式转换,还不如-0 /1 *1 %1
3)、转布尔:
Boolean(x);//万能的,任何人都可以转为布尔,绝对不会手动使用,还不如:!!x
***只有6个会为false:0,"",undefined,null,NaN,false,其余都为true
在分支/循环的条件之中,自动隐式转换,以后不管代老师在条件里面写的有多奇怪,你都要知道他会悄悄的变成一个布尔值,你只需要判断是不是那6个
2、隐式转换:都是出现在运算符之中
二、****运算符和表达式
1、*算数运算符:+ - * / %
特殊:1)、%:取余,判断奇偶性
2)、具有隐式转换,默认转为数字,在运算
undefined->NaN
null->0
true->1
false->0
特殊:1)、+运算,碰上字符串,拼接
2)、-*/%:字符串也可以转为数字,但是纯数字组成的字符串才行,包含非数字字符则为NaN
NaN参与任何算术运算结果仍为NaN
2、*比较运算符:> < >= <= == != === !==
结果:布尔值
隐式转换:默认,转为数字,在比较大小
特殊:1)、如果参与比较的左右两边都是字符串,则是按位PK每个字符的十六进制的unicode号(十进制ascii码)
0-9<A-Z<a-z<汉字:常识:汉字的第一个字:一:unicode号:4e00 - ascii:19968
最后一个字:龥:unicode号:9fa5 - ascii:40869
2)、NaN参与任何比较运算结果都为false,所以没有办法使用普通的比较运算来判断x是不是NaN
!isNaN(x);
3)、undefined==null;//true
区分:undefined===null;
全等:=== - 要求数值相同,并且数据类型也要相同,不再带有隐式转换
!== - 不再带有隐式转换的不等比较
重写String方法,看出==和===的区别
function String(x){
if(x===undefined){
return "undefined";//return->返回,后面跟着的就是返回的结果
}else if(x===null){
return "null";
}else{
return x.toString();
}
}
3、*逻辑运算符:
作用:综合比较,结果也是为布尔值
隐式转换:左右两边都会悄悄转为布尔值,再综合比较结果
&&:全部满足,才满足
一个不满足,则不满足
||:全部不满足,才不满足
一个满足,则满足
!:颠倒布尔值
特殊:短路逻辑:如果前一个条件,已经可以得出最终结论了,没有必要看后续
&&短路:如果前一个条件满足,才执行后一个操作,如果前一个条件不满足,则不管后续操作
目的:简化【简单的】分支:1、一个条件一件事,满足就做,不满足就不做:if(){} 2、【简单的】- 操作只能有一句话:多句操作导致我们以后维护项目时观看/阅读代码不方便,往往以后很多操作可能就只有一句话
语法:条件&&(操作);
||短路:实现浏览器兼容性问题:二选一
e=e||window.event;
4、位运算:
左移:m<<n,读作m左移了n位,翻译:m*2的n次方
右移:m>>n,读作m右移了n位,翻译:m/2的n次方
垃圾:底数只能固定为2,虽然可以设置幂,但是不能设置底数
5、*赋值运算:+= -= *= /= %= ++ --
一句话完成两个操作,先计算,再赋值回去
i++;//递增,每次只会固定+1
i+=1;//累加,每次加几由我们程序员决定
i=i+1;//最老土