从这篇文章开始,我将新开一个全栈开发笔记的专栏,专门记录我从基础开始学习前后端开发的收获和心得。
欢迎收藏本站或者关注我的专栏。
ECMAScript 标准
我们在学习前端技术的时候常听说要打好JavaScript基础,那么什么是JavaScript基础呢?
在我看来,其中很重要的一个环节就是要学习符合最新 ECMAScript(也就是我们常说的 ES)标准的JavaScript语言。
过去,我们总能看到网友用各种段子、梗图调侃JavaScript语言。实际上,这个语言确实在设计之初有着不少缺陷,给人的感觉就是不严谨。


但随着JavaScript和浏览器运行环境彻底绑定,成为前端事实标准后,有不少行业大佬在尝试引入新的语言风格和标准,来让这个语言变得更好。
此外,如果想要学习 TypeScript这个在JavaScript基础上更进一步、引入更严谨的类型系统的语言,则必须要学习和接受这些JavaScript的新标准,主流前端框架同样要求我们对这些内容有着较高的熟悉度。由此看来,学习 ES6+的JavaScript语法是非常有必要的。
JavaScript语言的新标准是由国际标准组织 ECMA International 推动的,所以这些标准又称ECMAScript 标准,简称 ES。
这些标准在制定、形成共识后,会由主流的 Chrome、Firefox 等浏览器推动兼容,Node.js等主流运行时也跟进新特性支持,从而实现从语言设计到运行环境落地的过程。

其实 ES6 及以后的新标准内容是相当丰富的,我们一篇文章也很面面俱到。这篇文章,我将从最基本的变量声明内容讲起,一步步深入到更复杂的内容。
const/let的引入
过去JavaScript定义变量的唯一关键字就是var,而从 ES6 开始,我们一般建议使用const和let关键字来定义变量。
顾名思义,const和let的区别主要在可变和不可变上,其中let为可变引用,可以重复赋值;const声明的是不可重新赋值的绑定。
需要注意的是,这里const的不可变性主要是指这个引用(或者再直白一点,内存地址)不能改变,但是如果被引用的对象或数组发生变化,这是合法的。
换言之,就是const对于原始类型是值不可变,对于对象、数组这样的复合类型就是地址不变。
举个例子:
const t = [1, -1, 3];
t.push(5);
console.log(t); // 合法,打印出[1, -1, 3, 5]
t = [1, -1, 3, 5]; // 不合法,不可重复赋值
这段代码是完全合法的,因为尽管t引用的数组新加入了一个数字 5,但是引用本身(内存地址)是没有改变的。
那么,你可能会问,这么做的好处是什么呢?
最显而易见的好处就是把可变和不可变引用分开了,代码更清晰,但是实际上还有更深层次的原因。
一个非常重要的原因就是原先var在设计变量作用域时存在缺陷。
var采用的是函数作用域,也就是说一个变量一经定义,在整个函数中都是可访问的。这种情况下可能会导致变量重复声明带来的数值覆盖,或者其他的意外行为。
反之,let和const采用的是相对更严谨的块作用域定义。也就是说,二者的作用域是明确限定在一对大括号{}里的。
我们来看一个例子:
function printing() {
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log(i);
}
这个函数打印出来的结果,除了for循环打印出的 0~9,for 循环外的console.log(i)会打印出 10。这一点,其实是不够理想的。
但是如果我们换用let来定义这个i变量:
function printing() {
for (let i = 0; i < 10; i++) {
console.log(i);
}
console.log(i); // ReferenceError: i is not defined
}
此时,for循环外的console.log(i)就会报出ReferenceError,因为let定义的变量是块级作用域,离开了 for 循环的块这个变量就不可以再访问了。
下一步写作计划
相信通过这简短的介绍,大家对 ES6+中最基本的变量定义问题有了初步的了解。
在后续几篇文章中,我将进一步展开讲解最新 ES 标准中的函数定义、解构赋值、异步编程等问题,然后逐步延伸到Solid.js前端框架以及基于Rust的后端框架,尽全力将全栈开发的知识用通俗易懂的语言讲清楚、讲明白。
欢迎关注我,我将给你带来更多精彩文章!