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
廣告