4.1 值類型轉(zhuǎn)換
類型轉(zhuǎn)換發(fā)生在靜態(tài)類型語言的編譯階段,而強制類型轉(zhuǎn)換則發(fā)生在動態(tài)類型語言的運行時(runtime)
4.3 顯式強制類型轉(zhuǎn)換
var c = "3.14";
var d = +c;
d; // 3.14
一元運算符 + 的另一個常見用途是將日期Date對象強制類型轉(zhuǎn)換為數(shù)字
var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" );
+d; // 1408369986000
我們常用下面的方法來獲得當前的時間戳:
var timestamp = +new Date();
不過最好還是使用ES5的Date.now()
var timestamp = Date.now();
應使用Date.now()來獲得當前的時間戳抬纸,使用new Date().getTime() 來獲得指定時間的時間戳茄厘。
奇特的 ~ 運算符
在2.3.5節(jié)中隆夯,講過字位運算符只適用于32位整數(shù)噪沙,運算符會強制操作數(shù)使用32位格式。這是通過抽象操作ToInt32來實現(xiàn)的哄辣。
ToInt32 首先執(zhí)行 ToNumber 強制類型轉(zhuǎn)換请梢,比如"123" 會先被轉(zhuǎn)換為123赠尾,然后再執(zhí)行ToInt32.
雖然嚴格說來并非強制類型轉(zhuǎn)換(因為返回值類型沒有發(fā)生變化),但字位運算符(如 | 和 ~)和某些特殊數(shù)字一起使用時會產(chǎn)生類似強制類型轉(zhuǎn)換的效果毅弧,返回另一個數(shù)字气嫁。
例如| 運算符的空操作 0 | x,它僅執(zhí)行 ToInt32 轉(zhuǎn)換
0 | -0; // 0
0 | NaN; // 0
0 | Infinity; // 0
0 | -Infinity; // 0
以上這些特殊數(shù)字無法以32位格式呈現(xiàn)(因為它們來自64位 IEEE 754 標準)夹纫,因此ToInt32 返回0.
在回到 ~ 峡谊。它首先將值強制轉(zhuǎn)換為 32 位數(shù)字患久,然后執(zhí)行字位操作 “非”(對每一個字位進行反轉(zhuǎn))
~x 大致等同于 -(x+1)。
~42 ; // -(42+1) ==> -43
在 -(x+1)中唯一能得到0(或嚴格說是 -0)的x 值是 -1梯影。也就是說如果 x 為 -1 時,~ 和一些數(shù)字值在一起會返回假值0庶香,其他情況則返回真值甲棍。
-1是個“哨位值”,JS中字符串的indexOf() 方法也遵循這一慣例赶掖,該方法在字符串中搜索指定的子字符串感猛,如果找到就返回子字符串所在的位置,否則返回 -1奢赂。
~ 和 indexOf() 一起了將結(jié)果強制類型轉(zhuǎn)換為真/假值:
var a = "Hello World";
~a.indexOf( "lo" ); // -4 真值
if( ~a.indexOf( "lo" ) ){ // true
// 找到匹配
}
~a.indexOf( "ol" ); // 0 假值
!~a.indexOf( "ol" ); // true
if( !~a.indexOf( "ol" ) ) { true
// 沒找到匹配
}
如果indexOf() 返回 -1陪白,~將其轉(zhuǎn)換為假值0, 其他情況一律轉(zhuǎn)換為真值
4.3.2 顯式解析數(shù)字字符串
var a = "42";
var b = "42px";
Number ( a ); // 42
parseInt( a ); // 42
Number( b ); // NaN
parseInt( b ); // 42
ES5之前parseInt() 需將第二個參數(shù)設為10呈驶,即可避免自行決定基數(shù)拷泽。按10進制數(shù)。
4.3.3 顯式轉(zhuǎn)換為布爾值
使用 Boolean( a ) 和 !!a 來進行強制類型轉(zhuǎn)換
4.4 隱式強制類型轉(zhuǎn)換
隱式強制類型轉(zhuǎn)換的作用是減少冗余袖瞻,讓代碼更簡潔司致。
4.4.2 字符串和數(shù)字之間的隱式強制類型轉(zhuǎn)換
簡單來說,如果 + 的其中一個操作數(shù)是字符串聋迎,則執(zhí)行字符串拼接脂矫,否則執(zhí)行數(shù)字加法。
4.4.5 || 和 &&
在JS中它們返回的并不是布爾值霉晕,它們返回的值是兩個操作數(shù)中的一個(且僅一個)庭再。
默認值通過 a = a || "hello"
守護運算符通過 a && foo(); 即第一個操作數(shù)為真值時,則返回第二個操作數(shù)的值牺堰。