写在前面的话:
ES6学习基础语法集结~ 本文是 一篇学习笔记,原文:http://es6.ruanyifeng.com/
关于EC6:
"ES6 的第一个版本,就这样在2015年6月发布了,正式名称就是《ECMAScript 2015标准》(简称 ES2015)。2016年6月,小幅修订的《ECMAScript 2016标准》(简称 ES2016)如期发布,这个版本可以看作是 ES6.1 版,因为两者的差异非常小(只新增了数组实例的includes
方法和指数运算符),基本上是同一个标准。根据计划,2017年6月发布 ES2017 标准。"
"因此,ES6 既是一个历史名词,也是一个泛指,含义是5.1版以后的 JavaScript 的下一代标准,涵盖了ES2015、ES2016、ES2017等等,而ES2015 则是正式名称,特指该年发布的正式版本的语言标准。本书中提到 ES6 的地方,一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。"
一、关于兼容:
各大浏览器的最新版本,对 ES6 的支持可以查看 kangax.github.io/es5-compat-table/es6/
Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码,从而在现有环境执行。这意味着,你可以用 ES6 的方式编写程序,又不用担心现有环境是否支持。
Babel 的配置文件是.babelrc
,存放在项目的根目录下。使用 Babel 的第一步,就是配置这个文件。
Babel提供babel-cli
工具,用于命令行转码。babel-cli
工具自带一个babel-node
命令,提供一个支持ES6的REPL环境。它支持Node的REPL环境的所有功能,而且可以直接运行ES6代码。
ES6 共有6种声明变量的方法(前两种是ES5的):
1. var
命令
2. function
命令
3. let命令
4. const
命令
5. import
命令
6. class
命令
二、let
1. let 所声明的变量,只在let
命令所在的代码块内有效。
ES6明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
也就是说,在代码块内,使用let
命令声明变量之前,该变量都是不可用的。
2. let
所声明的变量一定要在声明后使用,否则报错。
3. let
不允许在相同作用域内,重复声明同一个变量。因此,不能在函数内部重新声明参数。
4. ES6 允许块级作用域的任意嵌套。
外层作用域无法读取内层作用域的变量。
内层作用域可以定义外层作用域的同名变量。
5.本质上,块级作用域是一个语句,将多个操作封装在一起,没有返回值。在块级作用域之前加上do
,使它变为do
表达式,则可以得到返回值。let x =
do{ }
三、const
1. const
声明一个只读的常量。一旦声明,常量的值就不能改变,一旦声明,就必须要赋值。
2. const
的作用域与let
命令相同:只在声明所在的块级作用域内有效。
四、顶层对象(同一段代码为了能够在各种环境,都能取到顶层对象,现有的解决方式有二,见原文)
1.顶层对象:ES5 的顶层对象,本身也是一个问题,因为它在各种实现里面是不统一的:
1)浏览器环境 里面,顶层对象是 window对象
,但 Node 和 Web Worker 没有window
。
2)浏览器和 Web Worker 里面,self
也指向顶层对象,但是 Node 没有self
。
3)Node 里面,顶层对象是 global对象
,但其他环境都不支持。
2. 顶层对象的属性与全局变量(从ES6开始,全局变量将逐步与顶层对象的属性脱钩):
1. ES5之中,顶层对象的属性与全局变量是等价的。
不适之处: 1)顶层对象的属性赋值与全局变量的赋值,是同一件事,程序员很容易不知不觉地就创建了全局变量,顶层对象的属性是到处可以读写,不利于模块化编程。
2)window
对象有实体含义,指的是浏览器的窗口对象,顶层对象是一个有实体含义的对象,也是不合适的。
2.ES6 的改进:一方面规定,为了保持兼容性,var
命令和function
命令声明的全局变量,依旧是顶层对象的属性;
另一方面规定,let
命令、const
命令、class
命令声明的全局变量,不属于顶层对象的属性。
五、ES6新增的 关于字符串:
1.拼接:使用模板字符串 ``