先前在網路上看到一篇文章提到
JavaScript 是弱型別的語言
並說明與其他強型別語言的差異
先前在網路上看到一篇文章提到
JavaScript 是弱型別的語言
並說明與其他強型別語言的差異
其中有一段提到下面的code
let x = 10 + "javascript";
// result: x = 10javascript
let y = 10 + 1 + "javascript";
// result: y = 11javascript
let z = "javascript" + 10 + 1;
// result: z = javascript101
作者嘗試用此段code描述強型別與弱型別的差異
這似乎無法完整呈現差異
頂多只能描述它具有「型別推斷」的特性
這段Code在C#也能執行而且結果相同(以下使用LinqPad執行)
![](https://s3.us-west-2.amazonaws.com/secure.notion-static.com/1bd184ce-56a3-40db-a992-e8f494b12400/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221216%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221216T075140Z&X-Amz-Expires=86400&X-Amz-Signature=6cf1b1fe36c4f10d2c8fe363d1c6f6e8ee15bb34500ad1fd45abba9c4ce8c8d0&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject)
(補充Java執行結果)
![](https://dotblogsfile.blob.core.windows.net/user/張繹濱/13ad045d-b9ba-417f-a2a7-ef95370416e1/1671177137.png.png)
C#從C# 2.0開始支援var關鍵字稱為「隱含型別」
(Java 10開始也支援此關鍵字,但Java我比較沒接觸就不贅述)
編譯器於編譯時會將右側的型別視為該變數的型別進行宣告
(所以下面的這段code在C#會無法執行)
var x;
x = 10;
![](https://dotblogsfile.blob.core.windows.net/user/張繹濱/13ad045d-b9ba-417f-a2a7-ef95370416e1/1671177179.png.png)
(同樣的Java也是)
![](https://dotblogsfile.blob.core.windows.net/user/張繹濱/13ad045d-b9ba-417f-a2a7-ef95370416e1/1671177213.png.png)
若將作者的code稍微修改一下就可以清楚呈現差異
先看JavaScript 的執行結果
let x = 10 + "javascript";
// result: x = 10javascript
x = 11;
// result: x = 11
![](https://dotblogsfile.blob.core.windows.net/user/張繹濱/13ad045d-b9ba-417f-a2a7-ef95370416e1/1671177258.png.png)
再看C#的執行結果
var x = 10 + "csharp";
// result: x = 10csharp
x = 11;
// Cannot implicitly convert type 'int' to 'string'
可以看到C#會於編譯時產生錯誤訊息
![](https://dotblogsfile.blob.core.windows.net/user/張繹濱/13ad045d-b9ba-417f-a2a7-ef95370416e1/1671177285.png.png)
(事實上在寫的時候IDE就會直接顯示錯誤如下圖)
![](https://dotblogsfile.blob.core.windows.net/user/張繹濱/13ad045d-b9ba-417f-a2a7-ef95370416e1/1671177291.png.png)
(Java亦是如此)
![](https://dotblogsfile.blob.core.windows.net/user/張繹濱/13ad045d-b9ba-417f-a2a7-ef95370416e1/1671177316.png.png)
這就是強型別語言的特性
「當一個變數被宣告完畢時,其型別即被定義不可變更」
(換言之宣告時就要明確定義型別,使用var只是將型別的宣告交由編譯器決定,並不代表弱型別)
所以編譯器會驗證其型別並跳出錯誤
但弱型別如JavaScript並無此特性
所以當型別被推定為int後,仍然可以放入string 值
而此時該變數就會是string 型別
所以對於JavaScript 來說
如果沒有稍加留意的話其實很容易讓變數型別混亂
1=="1" true or false?
於是才發展出TypeScript想要解決此問題(當然還有其他問題,這只是其中一部分)
參考資料
- C# 3.0 開始提供var關鍵字
https://learn.microsoft.com/zh-tw/dotnet/csharp/language-reference/statements/declarations#implicitly-typed-local-variables
- Java 10 開始提供var關鍵字
https://docs.oracle.com/en/java/javase/13/language/local-variable-type-inference.html
- 型別推論
https://zh.wikipedia.org/zh-tw/类型推论
Notion筆記
https://round-gouda-bc6.notion.site/81c5729793cb4c02ba91a8111b4e12a5
Write By Charley Chang
新手發文,若有錯誤還請指教,
歡迎留言或Mail✉給我
![創用 CC 授權條款](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)
本著作係採用創用 CC 姓名標示-非商業性-相同方式分享 4.0 國際 授權條款授權.