如果你有其他编程语言的经验或培训,学习 JavaScript 既会变得更容易,也会变得更困难。特别是 JavaScript 作为 C 系列语言(C、C++、Java 等)的成员,这一点既能帮到你,又可能让你感到困惑。它使用了类似的语法,但实现的概念与其他 C 系列语言成员有所不同。因此,它可能会因其 C 或 Java 类似的语法而吸引你,但实际上它是一个完全不同的东西。其语义和设计受到编程语言 Self 和 Scheme 的影响。

对于 C 或 Java 程序员来说,学习 JS 中比较容易的部分是掌握语法。大部分的流程控制、逻辑和算术运算是相同的。深入语言后,你会发现一些差异。以下是与 Java 的一些区别。

变量的行为
首先,JS 是一种宽松类型的语言。这有几个含义:

  • 整数和浮点数都由 64 位浮点数表示(但令人惊讶的是,位运算仍然可用,并且有时更快)。
  • 你可以随意更改变量的类型。
  • 对象由键/值对组成,称为“属性”。属性值可以更改,完整的属性也可以随意添加或删除。
  • 还有很多其他特点,我们在编程时获得了非凡的能力,既能做出精彩的事情,也能做出一些非常愚蠢的事情。因此,在尝试驾驭动态变量的强大功能时,保持冷静非常重要。

变量的作用域

  • **模块之间:**在 Java 中,关键字 public、private 和 protected 定义了变量对其他模块(类)的可见性。而在 JS 中,仅有简单的 export/import 或 module.exports/require 机制。
  • **模块内部:**在 JS 中,模块内部的可见性由关键字 var(已过时,不再使用)、letconst 定义。Java 也有 var 关键字,但其语义稍有不同。JS 中的 const 相当于 Java 中的 final
  • 代码块内部:“代码块”是用大括号 {} 括起来的代码序列。JS 和 Java 中,代码块内变量的可见性是相同的(使用 letconst):变量在定义它的代码块以及其中包含的块中可见,但在定义块之外不可见。
  • **闭包:**闭包是一个匿名或命名的函数,它可以引用其封闭上下文中的变量。在这种情况下,函数“看到”的是函数创建时的变量值,而不是函数调用时的值。JS 从一开始就使用了这一概念。Java 也有类似的技术来访问外部上下文的变量,如内部类和 lambda 表达式,但不完全相同。


与 Java 不同,JS 是一种没有类的语言。相反,JS 使用原型来实现面向对象的特性,如继承。类可以被模拟,但这只是“语法糖”。如果你把类的概念从头脑中移除,学习过程会变得更容易。

Last modified: Monday, 13 January 2025, 1:27 AM