天行健, 君子以自强不息
Sunny's Blog
Title

Item 3 - Beware of Implicit Coercions

Effective 系列,每天一个Item,轻松提高JS。

这篇的题目是小心隐性强制转化,大概包括五个方面的内容

1.隐性强制转化可能会隐藏一些类型错误

文章举了一个例子:3+true; //4. 在一些严格类型检测的语言中,这行代码会抛出异常。但是js不仅不会抛出异常,而且还算出了结果4.这种把true隐性转化为1进行计算的例子就是js独有的特性。

2.常用的运算符号都有一些隐性强制转化的特点,下面以+号举例子

+号即可以计算数值,也可以进行字符串拼接,这个主要取决于它的参数类型,比如:

2 + 3; //5

"2" + 3 // "23"

1 + 2 + "3" // "33"

1+ "2" + 3 // "123"

3.关于NaN(not a number)

NaN的特点是他自身不等于自身,这个是js中的一个特例,我们用这个特例可以判断是不是NaN。

                function isReallyNaN(){
                    return x != x;
                }
            

我们还可以通过isNaN()来检测是否是非数字。

4.关于Obj和string的强制转化

Obj转化为number是通过valueOf方法,字符串是通过toString方法,Obj如果没有valueOf方法就会调用tostring方法

                1.
                var test1 = { name: "stella" }
                1+test1  // "1[object Object]"
                2.            
                var test1 = { name: "stella", valueOf: function(){ return "stella"  } }
                1+test1 // "1stella"
                3.
                var test1 = { name: "stella", valueOf: function(){ return "stella"  }, toString: function(){ return "sss"  } }
                1+test1 // "1stella"
                4.
                var test1 = { name: "stella", toString: function(){ return "sss"  } }
                1+test1 //"1sss"
            

5.js有7个强制转化为false的值(不一定==false,只是false值),其他都会转化为true值

这七个值是:false,0,-0,null,"", undefined, NaN.这里不是说NaN == false是true,而是指的if(NaN){} 条件不成立。

            //举一个例子
            function(a,b){
                if(!a) a = 100;
                if(!b) b = 200;
                return [a,b];
            }
            test(1,2) // [1,2];
            test() // [100,200]
            but
            test(0,0) // [100,200]
            这个就错误,忘记了0也是false值
            
            所以比较好的判断条件是 if( typeof a === undefined )
            
地势坤,君子以厚德载物