因为 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
,则表现得更像是一个转换器。
通报字面值或非对象值也会形成强迫范例转换的征象。
最好的要领就是显现地将值转换为 String
,Number
或 Boolean
三种范例之一。
转换为字符串 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