JavaScript/與其他語言的關係
外觀
如果你有其他語言的程式設計經驗或培訓,學習 JS 會更容易,但也更難。尤其是 JS 屬於 C 家族語言(C、C++、Java 等)這一事實,可能會同時帶來幫助和困惑。它使用常見的語法,但實現的概念與其他家族成員不同。因此,它可能會用類似 C 或 Java 的語法吸引你。但在其本質上,它是一個完全不同的東西。它的語義和設計受到 Self 和 Scheme 程式語言的影響。
對於 C 或 Java 程式設計師來說,容易的部分是學習語法。流程控制、邏輯和算術的大部分內容都是相同的。在深入研究這門語言後,你會注意到一些差異。以下是與 Java 的一些區別。
變數的行為
[edit | edit source]從最明顯的開始,JS 是一種弱型別語言。這有幾個含義
- 整數和浮點數都用 64 位浮點數表示(但奇怪的是,位運算仍然可用,有時速度更快)。
- 你可以隨意更改變數的型別。
- 物件由鍵值對組成,稱為“屬性”。值可以更改,並且可以隨意新增或刪除物件的完整屬性。
這個列表還在繼續,我們被賦予了非凡的力量,可以在程式設計時做一些奇妙而有時非常愚蠢的事情。因此,在試圖駕馭動態變數的力量時,保持清醒的頭腦非常重要。
變數的作用域
[edit | edit source]- 從模組到模組:在 Java 中,關鍵字
public、private和protected定義了變數對其他模組(類)的可見性。在 JS 中,只有簡單的export/import或者module.exports/require機制。
- 在模組內:在 JS 中,模組內的可見性由關鍵字
var(已過時,不再使用)、let和const定義。Java 也知道關鍵字var,但它的語義略有不同。JS 的const等同於 Java 的final。 - 在塊內:“塊”是被大括號 {} 包圍的程式碼序列。變數關於塊的可見性在 JS(使用
let或const)和 Java 中是相同的:變數在定義塊和包含的塊內可見,但在定義塊之外不可見。 - 閉包:閉包是一個 - 匿名或命名 - 函式,它可以引用其封閉上下文的變數。在這種情況下,函式在建立時“看到”變數的值,而不是在它被呼叫時“看到”的值。JS 從一開始就使用了這個概念。Java 使用類似但並不完全相同的技術來訪問外部上下文的變數:內部類和 lambda 表示式。
類
[edit | edit source]與 Java 不同,JS 是一種無類語言。相反,JS 使用原型來實現面向物件的特性,例如繼承。類可以模擬,但這只是“語法糖”,如果你從腦海中去除類的概念,學習過程會變得更容易。