JavaScript 隱式資料型別轉換

admin發表於2018-12-19

隱式資料型別轉換,就是程式碼可以根據上下文自動進行資料型別轉換。

更多資料型別轉換內容參閱JavaScript 資料型別轉換一章節。

看如下程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="8";
console.log(typeof str);
console.log(typeof +str);
console.log(typeof Number(str));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201812/19/181147r86f53603x1iwazf.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).宣告一個變數並賦值為"8",變數值是一個字串。

(2).typeof str返回值為字串,這個沒有任何問題。

(3).typeof +str返回numer,這是因為+str可以執行隱式資料型別轉換,我們並沒有刻意去轉換資料型別,但是JavaScript內部在遇到此運算上下文時,會自動嘗試將字串轉換為數值型別。

(4).最後一個則是顯式資料型別轉換,Number就是用來將引數轉換為數值型別的。

隱式資料型別轉換規則:

下面是比較常見的隱式資料型別轉換,當然更多的規則需要自己不斷的積累。

1.加號用作二元運算子:

加號(+)是一個多面手,可以用於算數計算,也可以進行字串連線。

如果兩個運算元中有一個是引用型別資料,也就是物件,那麼首先會將物件轉換為值型別資料。

如果運算元中,有一個是字串,那麼會將另一個操作轉換為字串,執行字串連線操作。程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log("8"+1);
console.log([8]+1);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201812/19/181328pg5bc440bm64zbuk.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1)."8"是字串,那麼會隱式將1也轉換為字串,然後執行字串連線操作。

(2).[8]是引用型別資料,那麼首先會將其轉換為值型別,首先嚐試呼叫valueOf方法,轉換失敗,然後再呼叫toString方法,轉換為字串"8",然後再將數字1轉換為字串,最後執行字串連線操作。

2.加號作為一元運算子:

如果運算元是物件,首先將其轉換為值型別資料,然後再將其轉換為數字,轉換失敗返回NaN。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log(typeof +[8]

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201812/19/181400a67fz8cdqrhx6znu.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

首先將陣列轉換為字串"8",然後再將其轉換為數字。

3.等號運算子(==):

是兩個等號,不是三個等號,三個等號是全等運算子,不執行資料型別轉換。

關於全等運算子相關內容可以參閱如下兩篇文章:

(1).JavaScript 三個等號 === 全等運算子一章節。

(2).JavaScript == 等號運算子一章節。

轉換規則如下:

(1).如果是數字和字串之間的比較,則將字串轉換為數字。

(2).如果是布林值之間的比較true轉換為1,false轉換為0。

(3).如果運算元中存在物件,則先將物件轉換為值型別資料,再進行比較。

4.減號作為二元運算子:

如果運算元是物件,首先將其轉換為值型別資料,然後再將其轉換為數字,轉換失敗返回NaN。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log([8]-5);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201812/19/181450dmpttpzdmpmnmxdn.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

首先將陣列轉換為值型別資料"8",然後再將其轉換為數字。

5.減號作為一元運算子:

如果運算元是物件,首先將其轉換為值型別資料,然後再將其轉換為數字,轉換失敗返回NaN。

最後會改變數字的符號,程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log(-[8]);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201812/19/181526jolhmiqfprjmzl46.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

6.>、>=、<、<=:

能夠利上述運算子的運算元只能是數字或者字串是。

所以如有需要,就要進行隱式資料型別轉換,轉換規則如下:

(1).如果運算元具有物件,那麼首先將其轉換為值型別資料。

(2).轉換後,如果兩個運算元都是字串,那麼進行碼值比較,參閱JavaScript 字串比較大小一文。

(3).如果運算元中存在非字串資料,那麼首先將它們轉換為數值,再比較,如果有運算元轉換失敗,此運算元返回NaN,最終結果返回false。

僅以大於號為例子做一下演示:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log(new Date >5);
console.log([6]>5);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201812/19/181559uzw9t839pll5ptlc.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).首先將Date物件轉換為值型別,會呼叫valueOf方法,返回值是時間戳,很明顯大於5。

(2).數字會首先被轉換為字串"6",然後將其轉換為6,再比較大小。

7.*、/、%、!:

*、/與%運算子首先會將運算元轉換為數值,再進行運算。

如果運算元轉換為數值失敗,那麼運算元返回NaN。

對於!運算子,會將運算元轉換為布林值,具體轉換規則參閱JavaScript 資料型別轉換一文。

相關文章