因为 Javascript 是弱类型语言,所以它会在任何可能的情形下对变量进行强制类型转换。

// These are true
new Number(10) == 10; // Number.toString() is converted
                      // back to a number

10 == '10';           // Strings gets converted to Number
10 == '+10 ';         // More string madness
10 == '010';          // And more 
isNaN(null) == false; // null converts to 0
                      // which of course is not NaN

// These are false
10 == 010;
10 == '-10';

为了避免以上例子中的问题,十分建议使用严格相等符号 ===。虽然这个方法可以解决大部分普遍的问题,但是由于 Javascript 的弱类型原因,还是会造成许多其他的问题。

内置类型的构造函数 Constructor

调用内置类型的构造函数时,是否使用关键字 new 将表现得大不相同。

new Number(10) === 10;     // False, Object and Number
Number(10) === 10;         // True, Number and Number
new Number(10) + 0 === 10; // True, due to implicit conversion

使用 new 将创造一个新的 Number 对象,而不使用 new,则表现得更像是一个转换器。

传递字面值或非对象值也会造成强制类型转换的现象。
最好的方法就是显示地将值转换为 StringNumberBoolean 三种类型之一。

转换为字符串 String

'' + 10 === '10'; // true

通过与一个空字符串相加可以很容易转换为字符串类型。

转换为数字 Number

+'10' === 10; // true

使用一个加号就可以将值转换为数字类型。

转换为数字的应用可以参考这个提问:
http://segmentfault.com/q/1010000000476683

转换为布尔值 Boolean

使用两次 not 操作符,可以将一个值转换为布尔值。

!!'foo';   // true
!!'';      // false
!!'0';     // true
!!'1';     // true
!!'-1'     // true
!!{};      // true
!!true;    // true

参考

http://bonsaiden.github.io/JavaScript-Garden/#types.casting


StephenLi
7k 声望488 粉丝

知不足。