Skip to content

JavaScript 是网页唯一脚本语言,它还被用作你可能熟悉的软件的脚本或插件语言,比如 Adobe 系列产品、WPS Office、Zotero 等。

JavaScript 是 ECMAScript 语言规范的一种实现。 语言规范(Language Specification)指的是一份描述语言语法和语义的文档, 实现(Implementation)则是根据语言规范对语言相关工具的开发,包括编译器、运行时环境等。 当然这个语言规范还有其他实现,比如 Adobe 系列产品的脚本语言 ExtendScript

ECMAScript 语言规范由 TC39 委员会制定,几乎每年都会更新。 其中有几个关键节点:ES3,ES5,ES6(ES2015),其中 ES6 包含很多新特性,本文档所有示例将参照 ES6 及以上。

参考资料: 如何更好的了解 ECMAScript全网最全 ECMAScript 攻略

MDN JavaScript 文档 是最好的 JavaScript 的学习资料,同时也是实质上的官方文档。 本文档只介绍 JavaScript 的基础知识和特别部分。

INFO

JavaScript 和 Java 的关系就像雷锋和雷锋塔的关系,最初 Netscape 公司将这门语言从 LiveScript 改名为 JavaScript 只因为当时流行 Java。

数据类型

JS 只有 2 种数据:原始值和对象。 原始值有 7 种:Boolean, Number, String, Null, Undefined, Symbol, BigInt。 原始值和对象的区别:

存在 2 种空值:nullundefined, 通常来说,null 表示人为设定的空值,undefined 是默认的空值(属于 JS 的历史遗留问题)。

在运行时中,可以使用 typeof 区分数据类型。 但需要注意的是,typeof null === 'object' 是成立的,这也是 JS 设计失误。 如果想要判断对象,正确的方式应该是 typeof obj === 'object' && obj !== null

原型(Prototype)

原型是 JS 实现 OOP 的方式。 当我们访问一个对象属性时,如果在对象中找不到该属性,则编译器会自动再从对象的原型上开始找, 如果对象的原型上还找不到,就从对象的原型的原型上找。 这种套娃式的链式结构称为 “原型链”, 原型链的终点是 Object.prototype,它的原型是 null,也就是没有原型。 如果达到原型链的终点了还没有找到属性,则返回 undefined

js
const obj = {};
console.log(obj.a); // except: undefined
obj.__proto__ = { a: 1 }; // 手动设置 obj 的原型
console.log(obj.a); // except: 1

JS 本身没有 “类” 这个概念,它通过函数和原型链去模拟 “类” 的行为。见 new 关键字

作用域(Scope)

实际开发中经常遇到的作用域有:全局作用域、函数作用域、模块作用域。

this 关键字

this 在全局作用域中指向全局对象,在模块作用域中指向 undefined,但在函数作用域中行为表现就很诡异 (这也是 JS 设计失误)。

闭包(Closure)

函数与词法环境的绑定形成闭包。

js
(function iife() {
  const a = 0;
  const b = 1;
  function fn() {
    a;
    debugger;
  }
  fn();
})();

垃圾回收(Garbage Collection, GC)

垃圾是指程序运行期间那些被使用后不再需要-的数据,对其进行回收以释放内存空间,避免内存泄漏。

  • 引用计数。 记录数据被引用的次数,如果没有引用则被回收。 但是无法处理循环引用的情况,因为循环引用将导致 2 个数据的引用次数至少为 1,进而无法被回收导致内存泄漏。
  • 标记清除。 定期从根对象开始,递归地查找引用的对象。把找到的对象标记为不清除,并回收找不到的对象。