es6涉及的那点东西
前言
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。
也就是说,ES6就是ES2015。
目前并不是所有浏览器都能兼容ES6全部特性,我们可以使用Babel工具来转换成es5
Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码
最常用的ES6特性
let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments
一、let 、const命令
1、let用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效
2、不存在变量提升,let不像var那样会发生“变量提升”现象。所以,变量一定要在声明后使用,否则报错。
console.log(foo); // 输出undefined
console.log(bar); // 报错ReferenceError
var foo =2;let bar =2;
3、在let和const之间,建议优先使用const,尤其是在全局环境,不应该设置变量,只应设置常量。
const声明常量还有两个好处,一是阅读代码的人立刻会意识到不应该修改这个值,二是防止了无意间修改变量值所导致的错误。
4、ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。也就是“暂时性死区”。
二、es6模块(module)
JavaScript一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如Ruby的require、Python的import,甚至就连CSS都有@import,但是JavaScript任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。
这有可能导致两个问题:
- 一方面js代码变得很臃肿,难以维护
- 另一方面我们常常得很注意每个script标签在html中的位置,因为它们通常有依赖关系,顺序错了可能就会出bug
- 在es6之前为解决上面提到的问题,我们得利用第三方提供的一些方案,主要有两种CommonJS(服务器端)和AMD(浏览器端,如require.js)。
在ES6之前,社区制定了一些模块加载方案,最主要的有CommonJS和AMD两种。前者用于服务器,后者用于浏览器。ES6在语言规格的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。
传统的写法
首先我们回顾下require.js的写法。假设我们有两个js文件: index.js和content.js,现在我们想要在index.js中使用content.js返回的结果,我们要怎么做呢?
首先定义:
//content.js
define('content.js', function(){
return'A cat';
})
然后require:
//index.js
require(['./content.js'], function(animal){
console.log(animal); //A cat
})
CommonJS写法
//index.js
var animal = require('./content.js')
//content.js
module.exports = 'A cat'
ES6的写法
//index.js
import animal from'./content'//content.js
export default'A cat'
// ES6模块
import { stat, exists, readFile } from 'fs';
上面代码的实质是从fs模块加载3个方法,其他方法不加载。这种加载称为“编译时加载”,即ES6可以在编译时就完成模块加载,效率要比CommonJS模块的加载方式高。当然,这也导致了没法引用ES6模块本身,因为它不是对象。
浏览器使用ES6模块的语法如下。
<script type="module" src="foo.js"></script>
上面代码在网页中插入一个模块foo.js,由于type属性设为module,所以浏览器知道这是一个ES6模块。
Node的默认模块格式是CommonJS,目前还没决定怎么支持ES6模块。所以,只能通过Babel这样的转码器,在Node里面使用ES6模块。
ES6的模块自动采用严格模式,不管你有没有在模块头部加上"use strict";。
1、export命令
模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。
一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量。例如,
// profile.js
export var firstName ='Michael';
export var lastName ='Jackson';
export var year =1958;
也可以是下面这种写法(优先考虑使用),
// profile.js
var firstName ='Michael';var lastName ='Jackson';var year =1958;
export {firstName, lastName, year};
export命令除了输出变量,还可以输出函数或类(class)。
export function multiply(x, y){return x * y;};
可以使用as关键字重命名
function v1(){...}
function v2(){...}
export {
v1 as streamV1,
v2 as streamV2,
v2 as streamLatestVersion
};
注意:export命令可以出现在模块的任何位置,只要处于模块顶层就可以。如果处于块级作用域内,就会报错,import命令也是如此,这是因为处于条件代码块之中,就没法做静态优化了,违背了ES6模块的设计初衷。下面代码中,export语句放在函数之中,结果报错。
function foo(){
export default 'bar' // SyntaxError
}
foo()
2、import命令
使用export命令定义了模块的对外接口以后,其他JS文件就可以通过import命令加载这个模块(文件)。
import {firstName, lastName, year} from './profile';
上面代码的import命令,就用于加载profile.js文件,并从中输入变量。import命令接受一个对象(用大括号表示),里面指定要从其他模块导入的变量名
使用as关键字将输入的变量重新命名
import { lastName as surname } from './profile';
import命令具有提升效果,会提升到整个模块的头部,首先执行。
foo();
import { foo } from 'my_module';
上面的代码不会报错,因为import的执行早于foo的调用。
import语句会执行所加载的模块,但是不输入任何值。
import 'lodash';
import 也可以引用文件夹/目录
如import router from './router'
这里router是个目录 里面有个index.js文件
3、模块整体加载
circle模块有2个方法
// circle.js
export function area(radius){return Math.PI * radius * radius;}
export function circumference(radius){return2* Math.PI * radius;}
通过使用*号加载整个模块
import * as circle from './circle';
console.log('圆面积:'+ circle.area(4));
console.log('圆周长:'+ circle.circumference(14));
三、class类
1、class的基本用法
ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类
//定义类
class Point{
constructor(x, y){
this.x = x;
this.y = y;
}
toString(){
return'('+this.x +', '+this.y +')';
}
}
constructor这就是构造方法,而this关键字则代表实例对象
定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
使用时直接对类使用new命令
class Bar{
doStuff(){
console.log('stuff');
}
}
var b =new Bar();
b.doStuff() // "stuff"
2、constructor构造方法
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
constructor(){}
3、class表达式
与函数一样,类也可以使用表达式的形式定义。
const MyClass = class Me{
getClassName(){
return Me.name;
}
};
这个类的名字是MyClass而不是Me,Me只在Class的内部代码可用,指代当前类。
如果类的内部没用到的话,可以省略Me
const MyClass = class {/* ... */};
采用Class表达式,可以写出立即执行的Class。
let person =newclass{
constructor(name){
this.name = name;
}
sayName(){
console.log(this.name);
}
}('张三');
person.sayName(); // "张三"
4、class类继承
通过extends关键字实现继承
class ColorPoint extends Point{}
四、arrow function箭头函数
function(i){
return i + 1;
} //ES5
(i) => i + 1//ES6
如果方程比较复杂,则需要用{}把代码包起来:
function(x, y){
x++;
y--;
return x + y;
}
(x, y) => {
x++; y--;
return x+y
}
在对象方法中使用this
传统的写法需要将this传给self,再用self来指代this
says(say){
var self = this;
setTimeout(function(){
console.log(self.type + ' says ' + say)
}, 1000)
使用es6的写法
classAnimal {
constructor(){
this.type = 'animal'
}
says(say){
setTimeout( () => {
console.log(this.type + ' says ' + say)
}, 1000)
}
}
var animal = new Animal()
animal.says('hi') //animal says hi
当我们使用箭头函数时,函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,它的this是继承外面的,因此内部的this就是外层代码块的this。
五、template string
当我们要插入大段的html内容到文档中时,传统的写法非常麻烦,所以之前我们通常会引用一些模板工具库,比如mustache等等
$("#result").append(
"There are <b>" + basket.count + "</b> " +
"items in your basket, " +
"<em>" + basket.onSale +
"</em> are on sale!"
);
我们要用一堆的'+'号来连接文本与变量,而使用ES6的新特性模板字符串``后
$("#result").append(`
There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!
`);
用反引号(\)来标识起始,用${}`来引用变量,而且所有的空格和缩进都会被保留在输出之中
六、default, rest
default很简单,意思就是默认值,调用animal()方法时忘了传参数,传统的做法就是加上这一句type = type || 'cat' 来指定默认值
function animal(type){
type = type || 'cat'
console.log(type)
}
animal()
用ES6我们而已直接这么写:
function animal(type = 'cat'){
console.log(type)
}
animal()
rest语法也很简单,看例子:
function animals(...types){
console.log(types)
}
animals('cat', 'dog', 'fish') //["cat", "dog", "fish"]
参考阅读
https://segmentfault.com/a/1190000004365693#articleHeader7
http://es6.ruanyifeng.com/
es6涉及的那点东西的更多相关文章
- es6之字符串添加的东西
在es6里边对字符串添加了一些东西! 字符串模板(非常友善) 相信大家之前都遇到过万恶的字符串拼接,真是噩梦,不过之后有了字符串模板之后,再也不用担心字符串拼接会乱了... 之前的字符串拼接 let ...
- ECMAScript 6(ES6)有什么新东西
你可能已经听说过ECMAScript 6,JavaScript的下一个版本,它有一些非常棒的新功能.这些功能略微复杂,在简单的脚本和复杂的应用中都可以使用.在这篇文章中,我们将挑选一些ES6的功能进行 ...
- es6笔记 day3---数组新增东西
Array.from()的作用就是把类数组转成数组.所谓类数组,就是有长度的数组 ----------------------------------------------------------- ...
- 6个小而美的es6新特性
译者:动静若参商 译文:http://www.zcfy.cc/article/1795 原文:https://davidwalsh.name/es6-features JavaScript社区中的每个 ...
- javascript的ES6学习总结(第三部分)
1.ES6中的面向对象的类 1.1.定义类 在ES5中,我们写一个类,通常是这么写的 function Person(name,age){ this.name = name; this.age = a ...
- 深入解读ES6系列(一)
ECMAScript 6(ES6)简介 前言: 哈喽小伙伴们,爱说'废'话的Z又回来了,欢迎来到Super IT曾的博客时间,我说啦这个月要带的福利,说了更的博客肯定不能水你们,要一起进步学习嘛,今天 ...
- 简单说说ES6新特性
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了. 它的目标,是使得 JavaScript 语言可以用来编写复杂的大型 ...
- clojure的语法糖
语法糖很多, 就是奔这个“懒” 来用clj的. 但是,在常见的书里(<Clojure编程><Clojure编程乐趣2>)都对很多基本语法,用法都介绍不全, 不细.看书看得很累. ...
- webpack-从零搭建vuecli环境
模块化思想 // 1最早期就只是html和css处理网页 // 2发明一种语言来操作html和css js // 3早期只是在html文件里直接在script标签里写一些脚本代码 // 4随着Ajax ...
随机推荐
- BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德
BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们 ...
- visual studio2015中开发python
之前下载了visual studio2017但是发现很不好用,不如使用matlab与visual studio混合编程就根本找不到visual studio,只有下了visual studio2015 ...
- openstack学习(1)
OpenStack项目结构 OpenStack架构 1. horizon以图形的方式管理所有的project,包括nova虚拟机的创建,neutron网络,cinder存储,glance镜像等: ...
- FPGA学习笔记(七)——FSM(Finite State Machine,有限状态机)设计
FPGA设计中,最重要的设计思想就是状态机的设计思想!状态机的本质就是对具有逻辑顺序和时序规律的事件的一种描述方法,它有三个要素:状态.输入.输出:状态也叫做状态变量(比如可以用电机的不同转速作为状态 ...
- 汽车之家汽车品牌Logo信息抓取 DotnetSpider实战[三]
一.正题前的唠叨 第一篇实战博客,阅读量1000+,第二篇,阅读量200+,两篇文章相差近5倍,这个差异真的令我很费劲,截止今天,我一直在思考为什么会有这么大的差距,是因为干货变少了,还是什么原因,一 ...
- Helm学习笔记
Helm学习笔记 Helm 是 Kubernetes 生态系统中的一个软件包管理工具.本文将介绍 Helm 中的相关概念和基本工作原理,并通过一个具体的示例学习如何使用 Helm 打包.分发.安装.升 ...
- python中的shutil模块
目录 python中的shutil模块 目录和文件操作 归档操作 python中的shutil模块 shutil模块对文件和文件集合提供了许多高级操作,特别是提供了支持文件复制和删除的函数. 目录和文 ...
- TiDB之mac上搭建及调试技巧
此文目的 由于本人最近已经成为TiDB的粉丝,所以就开始各种研究TiDB的源码,研究源码这个事情,首先就需要在自己电脑上不断的调试及修改.TiDB本身的代码是非常容易编译和调试的,但是要把PD.TiK ...
- 面试前必须要知道的Redis面试题
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面: 从零单排学Redis[青铜] 从零单排学 ...
- JenKins使用pm2部署.net core网站
登录事先准备好的 Jenkins 1 新建任务 2 源码管理 git 输入正确地址 3 构建环境:Delete workspace before build startsAbort the build ...