从这篇文章开始,我将新开一个全栈开发笔记的专栏,专门记录我从基础开始学习前后端开发的收获和心得。

欢迎收藏本站或者关注我的专栏


ECMAScript 标准

我们在学习前端技术的时候常听说要打好JavaScript基础,那么什么是JavaScript基础呢?

在我看来,其中很重要的一个环节就是要学习符合最新 ECMAScript(也就是我们常说的 ES)标准JavaScript语言。

过去,我们总能看到网友用各种段子、梗图调侃JavaScript语言。实际上,这个语言确实在设计之初有着不少缺陷,给人的感觉就是不严谨。

JavaScript梗图1

JavaScript梗图2

但随着JavaScript和浏览器运行环境彻底绑定,成为前端事实标准后,有不少行业大佬在尝试引入新的语言风格和标准,来让这个语言变得更好。

此外,如果想要学习 TypeScript这个在JavaScript基础上更进一步、引入更严谨的类型系统的语言,则必须要学习和接受这些JavaScript的新标准,主流前端框架同样要求我们对这些内容有着较高的熟悉度。由此看来,学习 ES6+的JavaScript语法是非常有必要的。

JavaScript语言的新标准是由国际标准组织 ECMA International 推动的,所以这些标准又称ECMAScript 标准,简称 ES

这些标准在制定、形成共识后,会由主流的 Chrome、Firefox 等浏览器推动兼容,Node.js等主流运行时也跟进新特性支持,从而实现从语言设计到运行环境落地的过程。

ES标准演化时间线

其实 ES6 及以后的新标准内容是相当丰富的,我们一篇文章也很面面俱到。这篇文章,我将从最基本的变量声明内容讲起,一步步深入到更复杂的内容。


const/let的引入

过去JavaScript定义变量的唯一关键字就是var,而从 ES6 开始,我们一般建议使用constlet关键字来定义变量。

顾名思义,constlet的区别主要在可变和不可变上,其中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采用的是函数作用域,也就是说一个变量一经定义,在整个函数中都是可访问的。这种情况下可能会导致变量重复声明带来的数值覆盖,或者其他的意外行为。

反之,letconst采用的是相对更严谨的块作用域定义。也就是说,二者的作用域是明确限定在一对大括号{}里的。

我们来看一个例子:

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的后端框架,尽全力将全栈开发的知识用通俗易懂的语言讲清楚、讲明白。

欢迎关注我,我将给你带来更多精彩文章!