走火入魔javascript — 分享几个好多人执意往里跳的”坑”
javascript 是一门容易上手也是一门如意犯错的语言,为什么这么说,它零活的类型转化有时让你摸不到头脑.
类型有没有定义都无所谓,一旦你的变量前少了var ,那可能会造成一个严重的bug ,污染了全局变量,甚至修改了全局变量的值,导致其他引用该变量的程序出错.
函数形参和实参可以不匹配,不匹配到什么程度呢? 类型可以不匹配,甚至参数数量也可以不匹配……..等等javascript里的一些坑,如果你发现了一定要绕过去,如果你发现不了,那可能浪费你很多的时间去调试一个bug
1.关于 NaN 类型,这是个非数值类型,那它的值是什么呢? 谁都不知道,的确,它自己都不知道.所以看下面的坑
if(NaN==NaN){ console.log('今天星期一'); } if(NaN!=NaN){ console.log('今天不是星期一'); }
亲,如果不看答案,你会猜测上面那个输出什么信息吗?
答案是: 今天不是星期一
为什么这样?因为NaN是个不确定的数
2.一个数值传递 A==B , B==C , 所以 C==A 但是在javascript中,有时还真不成立,看下面的例子
if(''=='0'){ console.log('今天星期一'); } if('0'==0){ console.log('今天星期二'); } if(0==''){ console.log('今天星期三'); }
上面的结果让你不知所措,为什么,因为 除了 今天是星期一 没有弹出,其他两条都弹出了.
为什么会产生上面的结果,这就要分析javascript中灵活多变的 类型转化,关于类型转化准备单独开一篇博来说明.
3.关于javascript中的10进制浮点数计算的模糊四舍五入导致明显的常识性错误
if((0.1+0.2)==0.3){ alert('我等于0.3'); } else{ alert('我不等于0.3'); }
我声明我不是在考大家10以内的加减法,关于上面的结果是弹出 else 分支内容”我不等于0.3″ 不管你信不信,反正我是信了.
为什么会出现上面这个低级错误呢,因为javascript中的类型设计中,关于数值类型只有Number 它包括了我们常见的所有数值(整数,小数,正负数….)而不像C#,JAVA 那样分为Int,float,double 等…… 并且javascript中对于10进制的浮点数默认采用4四舍五入的模糊精确,所以导致了 0.1+0.2!=0.3 的悲剧,其实0.1+0.2 等于 0.29999999 所以在用javascript进行浮点数计算的时候一定避免跳入这个坑中.