02 強(qiáng)制類型轉(zhuǎn)換

4.1 值類型轉(zhuǎn)換

類型轉(zhuǎn)換發(fā)生在靜態(tài)類型語(yǔ)言的編譯階段,而強(qiáng)制類型轉(zhuǎn)換則發(fā)生在動(dòng)態(tài)類型語(yǔ)言的運(yùn)行時(shí)(runtime)

4.3 顯式強(qiáng)制類型轉(zhuǎn)換

var c = "3.14";
var d = +c;

d;  // 3.14

一元運(yùn)算符 + 的另一個(gè)常見用途是將日期Date對(duì)象強(qiáng)制類型轉(zhuǎn)換為數(shù)字

var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" );
+d;   // 1408369986000

我們常用下面的方法來(lái)獲得當(dāng)前的時(shí)間戳:

var timestamp = +new Date();

不過(guò)最好還是使用ES5的Date.now()

var timestamp = Date.now();

應(yīng)使用Date.now()來(lái)獲得當(dāng)前的時(shí)間戳,使用new Date().getTime() 來(lái)獲得指定時(shí)間的時(shí)間戳。

奇特的 ~ 運(yùn)算符

在2.3.5節(jié)中,講過(guò)字位運(yùn)算符只適用于32位整數(shù),運(yùn)算符會(huì)強(qiáng)制操作數(shù)使用32位格式。這是通過(guò)抽象操作ToInt32來(lái)實(shí)現(xiàn)的。

ToInt32 首先執(zhí)行 ToNumber 強(qiáng)制類型轉(zhuǎn)換,比如"123" 會(huì)先被轉(zhuǎn)換為123,然后再執(zhí)行ToInt32.

雖然嚴(yán)格說(shuō)來(lái)并非強(qiáng)制類型轉(zhuǎn)換(因?yàn)榉祷刂殿愋蜎]有發(fā)生變化),但字位運(yùn)算符(如 | 和 ~)和某些特殊數(shù)字一起使用時(shí)會(huì)產(chǎn)生類似強(qiáng)制類型轉(zhuǎn)換的效果,返回另一個(gè)數(shù)字。

例如| 運(yùn)算符的空操作 0 | x,它僅執(zhí)行 ToInt32 轉(zhuǎn)換

0 | -0;  // 0
0 | NaN;  // 0
0 | Infinity;  // 0
0 | -Infinity;  // 0

以上這些特殊數(shù)字無(wú)法以32位格式呈現(xiàn)(因?yàn)樗鼈儊?lái)自64位 IEEE 754 標(biāo)準(zhǔn)),因此ToInt32 返回0.

在回到 ~ 。它首先將值強(qiáng)制轉(zhuǎn)換為 32 位數(shù)字,然后執(zhí)行字位操作 “非”(對(duì)每一個(gè)字位進(jìn)行反轉(zhuǎn))

~x 大致等同于 -(x+1)。

~42 ;   // -(42+1) ==> -43

在 -(x+1)中唯一能得到0(或嚴(yán)格說(shuō)是 -0)的x 值是 -1。也就是說(shuō)如果 x 為 -1 時(shí),~ 和一些數(shù)字值在一起會(huì)返回假值0,其他情況則返回真值。

-1是個(gè)“哨位值”,JS中字符串的indexOf() 方法也遵循這一慣例,該方法在字符串中搜索指定的子字符串,如果找到就返回子字符串所在的位置,否則返回 -1。

~ 和 indexOf() 一起了將結(jié)果強(qiáng)制類型轉(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() 需將第二個(gè)參數(shù)設(shè)為10,即可避免自行決定基數(shù)。按10進(jìn)制數(shù)。

4.3.3 顯式轉(zhuǎn)換為布爾值

使用 Boolean( a ) 和 !!a 來(lái)進(jìn)行強(qiáng)制類型轉(zhuǎn)換

4.4 隱式強(qiáng)制類型轉(zhuǎn)換

隱式強(qiáng)制類型轉(zhuǎn)換的作用是減少冗余,讓代碼更簡(jiǎn)潔。

4.4.2 字符串和數(shù)字之間的隱式強(qiáng)制類型轉(zhuǎn)換

簡(jiǎn)單來(lái)說(shuō),如果 + 的其中一個(gè)操作數(shù)是字符串,則執(zhí)行字符串拼接,否則執(zhí)行數(shù)字加法。

4.4.5 || 和 &&

在JS中它們返回的并不是布爾值,它們返回的值是兩個(gè)操作數(shù)中的一個(gè)(且僅一個(gè))。
默認(rèn)值通過(guò) a = a || "hello"
守護(hù)運(yùn)算符通過(guò) a && foo(); 即第一個(gè)操作數(shù)為真值時(shí),則返回第二個(gè)操作數(shù)的值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容