JavaScript/简介
JS 是一种实现国际标准 ECMAScript 的编程语言。它基于以下概念。
动态数据类型
JS 了解一些基本数据类型(数字、字符串、布尔值、BigInt、符号、未定义、空)以及数据类型对象的各种衍生物(数组、日期、错误、函数、正则表达式)。[1] [2] 如果变量存在,它的类型定义明确。但类型可以在任何时候通过将不同类型的变量赋值给变量来更改,例如:代码片段let x; x = 'Some text'; x = 2; x = [10, 11, 12];
是完全正确的。它不会创建编译时或运行时错误。只有变量x
的类型从未定义变为字符串,再变为数字,最后变为对象/数组。
(注意:JSON 是一种基于文本的数据格式,而不是数据类型。因此,它是语言无关的。它使用 JavaScript 对象语法。)
函数式编程
函数是类似于变量的一等公民。它们可以被赋值给变量,作为参数传递给其他函数,或者从函数中返回。代码片段function sayHello() {return 'Good morning'};let x = sayHello; console.log(x());
创建了一个函数sayHello,将其赋值给变量x,并通过调用x()执行它。
面向对象编程
JS 通过原型支持面向对象编程和继承。原型是一个可以克隆和扩展的对象。这样做会产生一个原型链。这与其他面向对象语言(如 Java)不同,Java 使用类来实现面向对象特性,例如继承。然而,在语法层面上,JS 中可以使用类。但这只是“语法糖”。在幕后,JS 使用原型机制。
C 语言风格语法
JS 语法与 C、Java 或 C 系列的其他成员非常相似。但我们必须始终考虑到概念和运行时行为有明显区别。
与 Java 的关系
除了具有 C 语言风格语法外,JS 与 Java 没有任何关系。为了避免可能的混淆,我们想清楚地强调 JS 和 Java 之间的一些区别。
最初,Netscape 开发了 JavaScript,而Sun Microsystems 开发了 Java。Java 包括类和对象实例,而 JavaScript 使用原型。在 Java 中,变量必须在使用之前声明,这在 JS 中是不必要的(但不推荐)。
在 Java 中,变量具有不可变的静态类型(例如int
或String
),在运行程序的整个生命周期中保持不变。在 JS 中,它们也有类型(例如Number
或String
),但这种类型可以在运行程序的生命周期中发生变化。类型是从环境中检测到的。因此,显式定义类型既没有必要也不可能。
int x = 0; // Java: 'name of type', 'name of variable', ...
let x = 0; // JS: 'let' or 'const', 'name of variable', ...
// The type will be 'Number' because of the right side of the equal sign.
let x = String (0); // JS: explicit change from 'Number' to 'String' BEFORE assignment to x
// The type will be 'String'. Test it with: alert(typeof x)
JS 引擎
JS 可以运行在客户端,也可以运行在服务器端。JS 的早期版本在充当简单解释器的浏览器中运行。如今,该语言由即时编译器(JIT)处理。它们解析脚本,创建抽象语法树(AST),优化树,从 AST 生成特定于 JIT 的字节码,从字节码生成特定于硬件的机器代码,并将机器代码投入执行。此类即时编译器不仅存在于浏览器中。它们也可以是其他应用程序的一部分,例如:主要用 C++ 编写的node.js。
广泛使用的 JS 引擎是
- V8 来自 Google:Google Chrome、Electron、Chromium、node.js
- SpiderMonkey 来自 Mozilla、Firefox
- JavaScriptCore 来自 Apple、Safari
- ActionScript 来自 Adobe、Flash