ES6语法初始
一:学习ES6之前也学过ES5,当然这就不做过多介绍了,ES6也是对ES5的一个升级,都知道javascript包含了ECMAScript,和Dom、Bom那么ES就是ECMAScript,ES6涵盖ES2015,ES2016,ES2017是一个标准
当然ES6也增加了许多新特性:比如ES6新增了let和const命令
1.1、Let命令:用于声明一个变量,类似于var,但是声明的变量只在包含let的代码块里有用,变量的值可以改变,当在代码块外调用就会报错
{
let a = 10;
var b = 1;
}
console.log(a);
console.log(b);
1.2、Const命令:只声明一个常量,常量嘛当然值是不可以改变的,一旦声明,值就不可以,但是不可以只声明这个变量,而不去赋值,因为这样会报错
const foo;
都在块级作用域内有用
1.3、Babel
Babel是一个转码器,通俗的说就是可以将ES6的代码转换为ES5的代码,那为什么要将他转换为ES5的代码呢,举个栗子来说:一个游戏,它支持13系统及以上版本的ios系统运行,但是13系统以下的却不可以运行,所以要升级系统才可以使用,而这里就像是降级一样,因为在ES6上的一些语法,ES5上是不可以使用的,所以通过这么一个Babel转码器就可以使得使用ES6写的代码就可以在老的版本上使用了,也不用担心其环境问题,例如:
转码前:
input map (item => item + 1);
转码后:
-> input map (function(item){
return item + 1;
});
这样箭头函数就变为了普通函数,就可以执行了,那什么是箭头函数呢:
函数的参数列表 => 函数体
例如:
var a =test ( function () {console.log() } );
使用箭头函数之后:
var a =test( () => { console.log() } );
这里不需要写函数名和function关键字,可能这样还是有点不理解,再往下看,
这样应该就很明确了吧,之后会对箭头函数做一个详细的总结。
当然想要使用Babel必须要用到babe-cli 当然想要使用vue语法就必须要用到vue-cli
这里来说一下babel-cli的安装:
1.3.1:cnpm install -global babel-cli(这里是全局安装) 这里用到cnpm命令 使用命令之前要确保已经安装cnpm如果没有安装则再项目根目录下运行 npm install -g cnpm --registry=https://registry.npm.taobao.org 这里是将下载的地址改为淘宝的镜像地址
然后使用npm install cnpm 安装好之后再执:1.3.1的命令
cnpm i -g babel-cli
第一步:配置文件.babelrc 这里是放在根目录下面,这里是用来设置转码的规则和插件
{
"presets": [],
"plugins": []
}
第二步:预设转码标准,之后将他加入.babelrc里面就可以使用了
cnpm install --save-dev babel-preset-latest 这里是最新的标准 这是开发标准,只在开发阶段使用,而在上线阶段不会用到
第三步:使用
1)转码并输出到控制台上:
babel ./1-es6-hello.js
2)转码并输出到新的文件
Babel ./1-helloes6.js --out-file 1-es5-hello.js
简写: babel ./1-helloes6.js -o 1-es5-hello.js
3)转码整个文件夹并输出到新的文件夹
babel src --out-dir dist
简写babel src -d dist
Babel 默认只转换新的javascript句法,而那些全局对象和一些全局对象包含的方法就不会转换,要向让这些也转换过去,就需要用到babel-polyfill
安装:cnpm install --save babel-polyfill
在js文件中引用: import 'babel-polyfill';
require('babel-polyfill');
这里要说明一点,使用import 引用有时候运行会报错,那具体怎么解决呢,网上找了许多也没有找到具体的解决办法,这里建议使用require
2、ES6模块化
说起模块化,来谈谈为什么要模块化,举个例子来说,造一辆车,分为很多工序,有这个车间也有那个车间,各个车间都有各个车间的任务,这样分工明确,造一辆车就很容易了,也不容易出错,如果没有各个车间,只是放在一起去完成,先不说能不能完成了,就连生成汽车的配件都和困难,当然也有组装的车间,各个车间生成出的各个部分,最后由组装车间来组合,那么一辆完整的车就造好了。
这样模块化就很好理解了,因为javascript一直都没有模块化体系,无法将整个大的文件拆分为各个小的文件然后相互依赖,也无法拼接起来,这样对于去开发大型复杂的项目就很困难,所以也就出现了ES6语法的模块化,实现了模块功能。这里的思想就是编译的时候就能够确定模块的依赖关系,以及输出和输入的变量 (也就是编译时加载)
import { stat, exists, readFile } from 'fs';
值得要注意的是:之前在js里{}里的是对象,而这里不是对象,我们可以看成一个方法,这里是导入,从fs来加载里面的三个方法
来举个栗子说明一下:先导出,再通过引用
2.1、导出:
const firstName =‘zs’;
const lastName =‘ls’;
export { firstName,lastName } //列表导出
export const a = 1; //导出单个属性
export function test(){
console.log();}
export default{ userName:’zs’;age:’18’ } //默认导出
当然一个模块只能有一个默认导出,但是不可以使用var ,let ,const用于导出默认值
注意: export a;报错 export var a =1; 因为没有提供对外的接口使用所以只能以后面那种方式来使用
2.2、导入
因为是模块化的当然导入由另一个模块来完成,当然就是另一个js页面了
import { firstName, lastName,a ,test } from“./module1.js”;注意这里一定要在后面加.js 不然会报错,具体是因为什么暂时我还不理解 //列表导入
import {firstName as first,lastName as last} from“./module1.js”; //这里是导入并重新命名
import * as person from‘./module1.js’ //导入全部即整个模块的内容
import‘module1.js’ //直接运行而不进行导入
如图为整个导入和导出最终的运行结果:
3、CommosJS模块化
commosJS模块就是对象和ES6模块化不同,这里是在运行的时候才能确定模块之间的依赖关系,以及输入输出的变量,而ES6模块化是在编译的时候就能确定模块与模块之间的依赖关系
let {firstName,lastName) = require(‘./module.js’);
当然等同于
let oj = require(‘./module.js’);
let firstName = oj.firstName;
let.lastName = oj.lastName;
这里该怎么理解呢:实质上是加载module.js的模块,然后来生成一个对象oj来接收其中的方法,然后再从oj里加载这其中的方法,也就是所说的运行时加载。
对象解构(模式匹配)
let data = {
username: '张三',
age: 12
}
let { username, age } = data
AMD模块
模块化对象:
Node内部提供一个Module构建函数,是module的实例,每一个内部都有一个对应的对象,代表当前模块
模块化差异:
首先呢在最新的ES6里,模块化,是在编译时就进行模块之间的依赖关系,而CommonJS是在运行的时候才能确定模块间的依赖关系,这是一种差异
那么他还有一个差异就是ES6输出的是一个值得引用,而CommonJS输出的是一个值得拷贝也就是说其实ES6就类似于引用拷贝,顺便再提一下值拷贝和引用拷贝:
值拷贝:它呢只是拷贝值,当源的值发生改变后,它的值不会去改变
引用拷贝:它呢,当源的值发生改变,它的值也会发生改变。
为什么会这样,这样来举个例子说明一下:
现在有A内存空间,里面有一a,值为1,作为源,那么现在进行值拷贝,将a拷贝,变为了B内存空间,这俩快为不同的内存空间,当a呢值改变为2,源的值变为2,但是B内存空间的a的值不会改变,这就是值拷贝
现在有a,b a作为源,a的值为1,指向地址B(内存空间B),b呢对a进行引用拷贝,这样呢b的地址也指向B,a和b指向同一块内存空间,当源a的值发生改变a=2,因为a和b指向同一块内存空间,同一地址,所有b的值也会改变b=2,这就是值拷贝和引用拷贝
所以ES6和CommonJS值得引用和值拷贝类似这个
4、包管理机制(npm)
1)项目初始化
cnpm init -y
2)安装依赖
全局依赖
保存在全局的包(依赖),任何地方都能使用
cnpm install --global xxx
简写:cnpm install -g xxx
局部依赖
开发依赖
cnpm install --save-dev xxx
简写:cnpm i -D xxx
产品依赖
cnpm install --save xxx
简写:cnpm i -S xxx
3)yarn使用
初始化一个新项目
yarn init
添加包
yarn add [package] --dev
更新包
yarn upgrade [package]
删除
yarn remove [package]
安装项目的全部依赖
yarn
或者yarn install