JavaScript的几个陷阱

    1、下面这行代码会输出什么?

console.log(0.2 + 0.1 == 0.3);

一看这么简单肯定输出true,但是稍微有点编程基础或者你仔细一想这题没那么简单,你就开始犹豫了,没错这会输出false。你可能不懂为什么,那么来看下面这个输出:

console.log(0.2 + 0.1);//0.30000000000000004

其实出现这个结果一点都不意外,计算机运算时先把十进制转换成二进制之后再进行计算,这样计算就会出现差异导致丢失精度,只要是浮点数进行计算,就有可能丢失精度,那么我们有什么办法规避这个问题吗?还是那句话,没有什么问题是程序员不能解决的,如果有,那就是还没找到原因。例如这个例子,完全可以把0.2和0.1都乘以10然后结果再除以10解决。


        2、null也是object对象,下面的代码将输出 true (而不是false) 到控制台:

var k = null;
console.log(typeof k === "object");//true

只要清楚这一点,所以要同时检查 bar 是否为 null来避免问题:

console.log((k !== null) && (typeof k === "object"));  //false

如果 k 是一个函数的时候,你也想对函数返回 true 的话,就要修改为:

console.log((k !== null) && ((typeof k === "object") || (typeof k === "function")));

如果 k 是一个数组(例如,当 var k = [];)的时候你也想对数组返回 false 时,修改为:

console.log((k !== null) && (typeof k === "object") && (toString.call(k ) !== "[object Array]"));

       

         3、类型转换问题:

console.log(1 + "1" + "1");//"111"
console.log(1 + +"1" + "1");//"21"
console.log("A" - "C"+ "1");//"NaN1"
console.log("A" - "B"+ 1);//NaN
console.log(+"1" + "1" + -"1")//"11-1"

JavaScript是弱类型语言,运算时会自动转换类型
1.这个很容易理解,数字连接字符串,自动转换为字符型,相当于字符串连接;
2."1"前面多的一个+被视为的运算符,所以先执行+"1",那么就把字符型转换为数字了,所以接着元算1+1然后在连接字符1,就是"21";

3.字符型没办法使用运算符 - 运算,而且都不行转换为数字,所以结果是NaN,连接字符串后为"NaN1";

4.同上,只是NaN不能同数字进行运算,所以结果还是NaN;

5.同理,先运算+"1"和+"1" ,相当于 1+"1" + -1,下一步执行为"11" + -1,结果为"11-1"。


        4、Replace()方法:

var v = "abacad";  
v.replace("a", "1"); // '1bacad' 
v.replace(/a/g, "1"); // '1b1c1d' 

JavaScript的replace()方法不像C#、JAVA中那样会匹配全部字符去替换,如果想全部替换只能使用正则。


       5、在JavaScript中不要使用跟HTML的id一样的变量名:

<input type="button" id="TheButton">
<script>
  TheButton = get("TheButton");
</script>

IE会报对象未定义的错误。
https://mp.weixin.qq.com/s?__biz=MzUyNTc4NjU4Mw==&mid=2247483764&idx=1&sn=a674fc86433fd5497912294abc0ac444&chksm=fa198dcccd6e04da8d50d410af06f2ee054a12c78fa0ac4129f11cac835223db94f4bac734ce#rd

猜你喜欢

转载自blog.csdn.net/zhuaizhuaihenguai/article/details/80179216