JavaScript:為什麼 % 運算子可以作用於字串? - (型別強制轉換)


假設我們有一段程式碼片段,它產生了一些令人驚訝的結果。首先,我們看到模運算子也可以很好地作用於字串(令人驚訝)。其次,兩個字串的連線產生了奇怪的結果。

我們需要解釋為什麼 JavaScript 會這樣做?

這是問題程式碼:

示例

const numStr = '127';
const result = numStr % 5;
const firstName = 'Armaan';
const lastName = 'Malik';
const fullName = firstName + + lastName;
console.log('modulo result: ', result);
console.log('full name: ', fullName);

輸出

modulo result: 2
full name: ArmaanNaN

在深入研究程式碼之前,讓我們先了解一下 JavaScript 最基本的概念之一:型別強制轉換。

型別強制轉換

基本上,型別強制轉換是 JavaScript 編譯器用來將一種資料型別更改為另一種資料型別的方法。有效的型別強制轉換示例包括將字串轉換為布林值、將數字轉換為字串等等。

型別強制轉換是一個非常廣泛的話題,為了限制本解決方案的長度,我們將僅探討本程式碼片段中使用的內容。在兩種型別的型別強制轉換中,一種是由編譯器自動執行的,稱為隱式型別強制轉換。

它遵循:

任何資料型別(原始型別或非原始型別)將隱式強制轉換為:

  • 字串(當與二元 + 運算子一起使用時)。

  • 數字(當與算術運算子(如 +、-、/、*、%)一起使用時,只有單目 + 會觸發數字強制轉換)。

數字強制轉換(非二元 +),當與比較運算子、位運算子或鬆散相等運算子 [==] 一起使用時。

  • 布林值(當與邏輯運算子 & | ! 一起使用時)。

***需要注意的是,單目 (+) 運算子的優先順序高於二元 (+) 運算子。

程式碼解釋

因此,在這些事情明確之後,讓我們轉到程式碼並逐行進行:

Line 2 → result = '127' % 5;

隱式強制轉換接收並看到 % 運算子,因此它將字串 '127' 轉換為數字 127,並將 2 儲存在結果中:

Line 5 → fullName = firstName + + lastName;
fullName = firstName + (+lastName);

通常情況下,計算將從左到右進行,但是由於單目運算子的優先順序,它首先被計算為數字,並且操作變成這樣:

fullName = firstName + NaN;

然後

fullName = ArmaanNaN

更新於:2020年8月18日

266 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告