这是一份JS学习指南,简单列出了JS包含的知识范围。
JS简单介绍
JS是一门命令式语言,它的核心是处理数据。
JS可以用于Web开发、服务端编程、桌面应用程序开发、游戏开发等领域。
知识范围
JS从大体上可以分成三个部分。
- ECMAScript
- 浏览器
- NodeJS
每部分分别由语法、语义、语用组成,其中语法包含基础语法和API(标准库),语义包含最核心的一些概念,语用则是它的一些最佳实践。
所以本文的结构是这样的:
- ECMAScript语法
- ECMAScript语义
- ECMAScript语用
- 浏览器语法
- 浏览器语义
- 浏览器语用
- NodeJS语法
- NodeJS语义
- NodeJS语用
我认为学习JS最重要、也是最基础的部分,是掌握ECMAScript的语法,所以我会对这部分做更详细的介绍。
ECMAScript语法知识结构
词法文法是一门编程语言最基础的部分,所以理应放在最开头的部分。
由于JS的核心是处理数据,所以它的语法又可以分为:数据的表达、数据的运算、数据的流程以及数据的存储。
下面我们分别来看:
词法文法
ECMAScript 源码文本会被从左到右扫描,并被分解转换成一系列称为“token”的小组件,Token是代码中的最小单元,包括控制符、空白符、行终止符、注释、关键字、字面量以及行尾分号补全等。
JS中的词法文法,主要包含如下内容:
- 格式控制符
- 空白符
- 行终止符
- 注释
- 标识符和保留字
- 字面量
- 自动分号补全
数据的表达
一门处理数据的编程语言,最先规定的应该是数据如何表达,JS对数据的表达这部分有以下三块内容:
- 数据类型
- 类型转换
- 数据声明
数据的运算
继数据的表达之后,还得规定数据是如何运算的,JS对数据的运算靠的是操作符,它包含一些关键字和算术运算符。
比如this、yield、yield*、await、new、new.target、import.meta、import() 、super、.、[key]、?.、()、算术运算符。
数据的流程
然后,是数据的流程,JS中流程控制语句大致分为以下四类:
- 条件语句
- 循环语句
- 跳转语句
- 特殊语句
数据的存储
这部分也可以称为内存管理,不管什么程序语言,内存生命周期基本是一致的:
- 分配所需要的内存
- 使用分配到的内存(读、写)
- 不需要时将其释放\归还(垃圾回收)
不像C语言,JS不提供内存管理接口,它是在创建变量时自动分配内存,并且在不使用它们时“自动”释放。
在JS中,第一和第三部分是隐含的,所以JS开发者感觉他们可以不关心内存管理。
这里特别要注意的是JS中对原始类型和引用类型数据的存储:原始类型在内存存放值;引用类型存放地址,这个地址指向引用值开辟的内存空间。
ECMAScript语义
JS语言是面向对象语言,但它并不存粹,它还支持其他编程范式(比如函数式编程)。
这样的特性决定了JS中将会有它自己的一些核心概念,比如作用域与作用域链、原型与原型链、函数、对象、类等。
ECMAScript语用
JS语用很重要,因为JS是一门脚本语言,为了保持简单,缺少一些关键功能,这直接导致了它的一个显著特点:对于其他语言,您需要学习语言的各种功能,而对于JS,您常常需要学习各种解决问题的模式。
这部分的重点在于设计模式、以及大量第三方库的使用。
浏览器语法
所谓浏览器语法,即是繁多的Web APIs。
这部分知识极多,我目前只熟悉使用其中的几种API,但也够用在平时的开发中了,如果您想探索更广阔的领域,这块的知识值得研究。
浏览器语义
浏览器内部有它自己的进程模型、事件循环机制、渲染原理,还包括DOM事件、DOM尺寸和位置、AJAX、跨域、调试等知识,都属于浏览器的核心概念,我认为学习浏览器最好从它的语义,掌握这些概念开始。
浏览器语用
浏览器功能十分强大!它的开发者工具,可以做很多事,还有拓展程序,可以附加更多功能,且未来浏览器只会越来越强大,用途越来越广泛,这块的知识非常值得学习!
NodeJS语法
其核心是JS语法,只是在JS基础上,重新定义了全局对象,增加了很多内置模块。
在掌握JS语法的基础上,这部分只需掌握NodeJS的 API 即可。
NodeJS语义
NodeJS也有自己的事件循环机制,另外在代码调试上与浏览器不一样。如果您是深耕Node开发,而不只是前端的话,就得深入学习了,但对我而言,目前只需要了解事件循环机制与它的调试就够用了。
NodeJS语用
NodeJS最大的用途,是作为JS的运行环境,所以最常用在构建web服务器。
实际上,能用java搭建的项目,都可以用NodeJS去做,不过它的生态环境没有java那么完善,我相信未来它会越来越好。
如果您想从前端转型到后端,从NodeJS开始,是比较容易的。
总结
最后总结一下我理解的学习JS之道:
- 语法、语义、语用是知识的一体三面,不只是要熟悉有哪些API,还要理解它们的含义,更要学会如何使用它们,掌握它们是一种互相转化、螺旋上升的过程。
- 学习也不是一堆知识的堆积,而是对知识的理解与联结。
- 编程知识纷繁且杂多,各种各样的新知识层出不穷,最终我们不是要追求那永无止境的知识,而是要有解决问题的能力,而这个能力不仅来自于知识掌握的程度,更是一种思维和行为的习惯。