跳轉到內容

JavaScript/與其他語言的關係

來自華夏公益教科書,自由的教科書,來自一個開放的世界




如果你有其他語言的程式設計經驗或培訓,學習 JS 會更容易,但也更難。尤其是 JS 屬於 C 家族語言(C、C++、Java 等)這一事實,可能會同時帶來幫助和困惑。它使用常見的語法,但實現的概念與其他家族成員不同。因此,它可能會用類似 C 或 Java 的語法吸引你。但在其本質上,它是一個完全不同的東西。它的語義和設計受到 SelfScheme 程式語言的影響。

對於 C 或 Java 程式設計師來說,容易的部分是學習語法。流程控制、邏輯和算術的大部分內容都是相同的。在深入研究這門語言後,你會注意到一些差異。以下是與 Java 的一些區別

變數的行為

[edit | edit source]

從最明顯的開始,JS 是一種弱型別語言。這有幾個含義

  • 整數和浮點數都用 64 位浮點數表示(但奇怪的是,位運算仍然可用,有時速度更快)。
  • 你可以隨意更改變數的型別。
  • 物件由鍵值對組成,稱為“屬性”。值可以更改,並且可以隨意新增或刪除物件的完整屬性。

這個列表還在繼續,我們被賦予了非凡的力量,可以在程式設計時做一些奇妙而有時非常愚蠢的事情。因此,在試圖駕馭動態變數的力量時,保持清醒的頭腦非常重要。

變數的作用域

[edit | edit source]
  • 從模組到模組:在 Java 中,關鍵字publicprivateprotected定義了變數對其他模組(類)的可見性。在 JS 中,只有簡單的export/import 或者 module.exports/require 機制。
  • 在模組內:在 JS 中,模組內的可見性由關鍵字var(已過時,不再使用)、letconst定義。Java 也知道關鍵字var,但它的語義略有不同。JS 的const 等同於 Java 的final
  • 在塊內:“塊”是被大括號 {} 包圍的程式碼序列。變數關於塊的可見性在 JS(使用letconst)和 Java 中是相同的:變數在定義塊和包含的塊內可見,但在定義塊之外不可見。
  • 閉包閉包是一個 - 匿名或命名 - 函式,它可以引用其封閉上下文的變數。在這種情況下,函式在建立時“看到”變數的值,而不是在它被呼叫時“看到”的值。JS 從一開始就使用了這個概念。Java 使用類似但並不完全相同的技術來訪問外部上下文的變數:內部類和 lambda 表示式。

與 Java 不同,JS 是一種無類語言。相反,JS 使用原型來實現面向物件的特性,例如繼承。類可以模擬,但這只是“語法糖”,如果你從腦海中去除類的概念,學習過程會變得更容易。

華夏公益教科書