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 使用原型来实现面向对象的特性,例如继承。类可以模拟,但这只是“语法糖”,如果你从脑海中去除类的概念,学习过程会变得更容易。