ES6语法

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 //导入全部即整个模块的内容

importmodule1.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


版权声明:本文为weixin_46285310原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。