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 种空值:null
和 undefined
, 通常来说,null
表示人为设定的空值,undefined
是默认的空值(属于 JS 的历史遗留问题)。
在运行时中,可以使用 typeof
区分数据类型。 但需要注意的是,typeof null === 'object'
是成立的,这也是 JS 设计失误。 如果想要判断对象,正确的方式应该是 typeof obj === 'object' && obj !== null
原型(Prototype)
原型是 JS 实现 OOP 的方式。 当我们访问一个对象属性时,如果在对象中找不到该属性,则编译器会自动再从对象的原型上开始找, 如果对象的原型上还找不到,就从对象的原型的原型上找。 这种套娃式的链式结构称为 “原型链”, 原型链的终点是 Object.prototype
,它的原型是 null
,也就是没有原型。 如果达到原型链的终点了还没有找到属性,则返回 undefined
。
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)
函数与词法环境的绑定形成闭包。
(function iife() {
const a = 0;
const b = 1;
function fn() {
a;
debugger;
}
fn();
})();
垃圾回收(Garbage Collection, GC)
垃圾是指程序运行期间那些被使用后不再需要-的数据,对其进行回收以释放内存空间,避免内存泄漏。
- 引用计数。 记录数据被引用的次数,如果没有引用则被回收。 但是无法处理循环引用的情况,因为循环引用将导致 2 个数据的引用次数至少为 1,进而无法被回收导致内存泄漏。
- 标记清除。 定期从根对象开始,递归地查找引用的对象。把找到的对象标记为不清除,并回收找不到的对象。