JS语法规范ECMAScript(ES6)基础知识及核心原理
ES6 发展史
这里推荐阅读阮一峰ECMAScript 6 入门
使用babel对ES6进行编译
1、 下载安装Babel
环境:需要在电脑上安装node(node自带npm包管理器)
1 | npm install babel-cli -g 把模块安装在全局环境下(在任何的项目中,都可以使用命令来变异我们的代码) |
安装日志
1 | $ npm install babel-cli -g |
C:\Users\xxx\AppData\Roaming\npm
这个路径很重要
1、在该路径下可以看到,安装babel后声称的xxx.cmd文件(可以在doc窗口执行命令)
babel.cmd
以后可以使用babel命令babel-node.cmd
2、执行babel命令后我们可以完成一些变异或者其他任务,主要原因是执行babel命令后,会自动加在一些处理任务的文件
二、配置.babelrc文件,安装一些语言解析包
1、我们需要把.babelrc文件配置在当前项目的根目录下(这个文件没有文件名,后缀名就是.babelrc)
a:在电脑上不能直接创建没有文件名的文件,我们需要使用WS中的new->file创建,或者使用命令创建
dir>.babelrc
b:babelrc这个后缀名在某些ws中是不识别的,它其实是一个json文件,我们需要在ws中配置一下(让它隶属于json文件)
2、在文件中编写一些内容
1 | { |
3、安装以来的语言解析包
在当前项目的根目录下安装(不是安装在全局),需要特别注意的是:需要在当前项目根目录中打开doc命令才可以
npm install babel-preset-latest
安装最新已经发布的语言标准解析模块npm install babel-preset-stage-2
安装当前还没有发布但是已经进入草案的语言解析模块(如果你的代码中用到了发布非标准的语法,我们需要安装它)安装成功后,会在当前目录下存在一个
node_modules
文件夹,在这个文件夹中有我们安装的模块4、完成最后.babelrc文件的配置
1 | { |
三、使用命令变异js代码
基本上所有支持命令操作的模块都有一个命令
babel --help / babel -h
查看帮助
babel --version / babel -V
查看版本号
babel --out-file / babel -o
把某一个js文件中的es6代码进行编译
babel --out-dir / babel -d
把某一个文件夹中所有的js文件中的es6代码进行编译
babel --watch / babel -w
监听文件中代码的改变,当代码改变后,会自动进行编译
1 | babel ES6/1.js -o ES5/1.js //=> 当个文件编译后保存 |
ES6中的let和const
let 基础语法
let 变量名 = 变量值
1、 let声明变量不存在变量提升
1 | console.log(str); //=> undefined |
2、使用let定义的变量不允许在
同一个作用域中
重复生命
1 | var num = 12; |
3、暂时性死区:使用typeof检测一个未被声明过的变量
1 | ; |
4、ES6语法创建的变量(let)存在会级作用域,ES5语法创建变量(var/function)没有会级作用域
[ES5]
window全局作用域
函数执行形成的私有作用域[ES6]
除了ES5中的两个作用域,ES6中新增加块级作用域(我们可以把块级作用域理解为私有作用域:存在私有变量和作用域链的一些机制)
1 | let num = 12, |
1 |
|
1 | for(let i = 0; i < 5; i += 1){ |
1 | let i = 10; |
1 | try{ |
1 | switch(10){ |
1 | let obj = {name: 'a'}; |
增加这些块级作用域的作用
1 | let list = document.getElementsByClassName('item'); |
const的基础语法
const的细节知识点和let一样,和let的主要区别在于:let是创建变量,const是创建常量
1 | let num = 12; |
JS中创建变量方式汇总
var: ES5中创建变量
function: ES5中创建函数
ES5中创建变量或函数存在:变量提升、重复声明等特征,但是没有块级作用域
let
: ES6中创建变量const
: ES6中创建常量
ES6中创建的变量或者常量都不可以变量提升,也不可以重复生命,而且还存在块级作用域
class
: ES6中创建类的方式import
: ES6中模块导入的方式
1 | class Parent { |
ES6的解构赋值
按照原有的解构,把原有值中的某一部分内容快速获取到(快速复制给一个变量)
数组的解构赋值
解构赋值本身是ES6的语法规范,使用什么关键字来申明这些变量是无所谓的
1 | let ary = [12,23,34]; |
多位数组的解构赋值,可以让我们快速获取到需要的结果
1 | //=> [12,[23,34],[45,56,[67,78]]] 把多维数组中的34 56 78获取到,并分别复制给A B C |
在解构赋值中,可以给某一项设置默认值
1 | let [,,,A] = [12,23,34]; |
1 | let [A,...B] = [12,23,34,45]; |
对象的解构赋值
1 | let {name, age} = {name: 'a', age: 12}; |
1 | let {C=0} = {name: 'a', age: 12}; |
1 | let {name} = {name: 'a', age: 12}; |
1 | let {name, ...arg} = {name: 'a', age: 12, sex: 0}; |
1 | //=> 把对象进行浅克隆(只把第一级克隆了) |
1 | let {name:A, age:B} = {name: 'a', age: 12} |
1 | let data = [ |
解构赋值在项目中的应用
可以快速接收到传递的多个值(我传递的是一个对象或数组)
1 | //=> 快速交换两个变量的值 |
1 | let fn = function(){ |
1 | let fn = function([a, b, c, d = 0]){ |
1 | //=> 设置参数默认值 |
1 | let obj = new Map(); |
ES6中的箭头函数
箭头函数基础语法
1 | let fn = function(x, y){ |
1 | //=> 将上面函数改写成箭头函数 |
1 | let fn = function(n){ |
1 | let fn = n => { |
箭头函数中不支持arguments
1 | let fn = function(){ |
1 | let fn = ()=> { |
1 | let fn = (...arg) => eval(arg.join('+')); |
箭头函数中的this问题
普通函数中的this指向问题
1 | //=> 普通函数执行this的指向:看函数执行前面是否有点,点前面是谁this就是谁,没有点this指向window或者undefined(严格模式下) |
箭头函数中的this
1 | let obj = { |
项目中并不是把所有的函数都改成箭头函数,根据自身需要来修改即可
箭头函数的一点扩充
1 | let fn = ()=>{ |
对于层级桥操的箭头函数
1 | let fn = function(i){ |
ES6中创建类的基础语法
ES5中创建类和实例,以及如何禁止用户把类当作普通函数执行:
new.target
1 | function Person(name, age) { |
ES6中创建类
1 | // console.log(Person); //=> Uncaught ReferenceError Person is not defined 不存在变量提升 |
1 | class Person { |