前言

ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更“甜”的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数(=>)、class等等。用一句话来说就是:

ES6给我们提供了许多的新语法和代码特性来提高javascript的体验

不过遗憾的是,现在还没有浏览器能够很好的支持es6语法,点这里查看浏览器支持情况,所以我们在开发中还需要用babel进行转换为CommonJS这种模块化标准的语法。

因为下面我会讲到一些es6新特性的例子,如果想要运行试试效果的话,可以点这里去测试es6的代码。

常用es6特性

然后我下面简单的介绍一些很常用的语法特性,如果想完整的了解ES6,我推荐大家点这里

定义函数

我们先来看一个基本的新特性,在javascript中,定义函数需要关键字function,但是在es6中,还有更先进的写法,我们来看:

es6写法:

var human = {
breathe(name) { //不需要function也能定义breathe函数。
console.log(name + ' is breathing...');
}
};
human.breathe('jarson'); //输出 ‘jarson is breathing...’

转成js代码:

var human = {
breathe: function(name) {
console.log(name + 'is breathing...');
}
};
human.breathe('jarson');

很神奇对不对?这样一对比,就可以看出es6的写法让人简单易懂。别着急,下面还有更神奇的。

创建类

我们知道,javascript不像java是面向对象编程的语言,而只可以说是基于对象编程的语言。所以在js中,我们通常都是用function和prototype来模拟这个概念。

但是现在有了es6,我们可以像java那样‘明目张胆’的创建一个类了:

class Human {
constructor(name) {
this.name = name;
}
breathe() {
console.log(this.name + " is breathing");
}
}
var man = new Human("jarson");
man.breathe(); //jarson is breathing

上面代码转为js格式:

function Human(name) {
this.name = name;
this.breathe = function() {
console.log(this.name + ' is breathing');
}
}
var man = new Human('jarson');
man.breathe(); //jarson is breathing

所以我们看到,我们可以像java那样语义化的去创建一个类。另外,js中的继承父类,需要用prototype来实现。那么在es6中,又有什么新的方法来实现类的继承呢?继续看:

假如我们要创建一个Man类继承上面的Human类,es6代码:

class Man extends Human {
constructor(name, sex) {
super(name);
this.sex = sex;
}
info(){
console.log(this.name + 'is ' + this.sex);
}
}
var xx = new Man('jarson', 'boy');
xx.breathe(); //jarson is breathing
xx.info(); //arsonis boy

代码很简单,不作赘述,可以使用文章里提到的在线工具去试试效果就能明白了。需要注意的是:super()是父类的构造函数。

模块

在ES6标准中,javascript原生支持module了。将不同功能的代码分别写在不同文件中,各模块只需导出(export)公共接口部分,然后在需要使用的地方通过模块的导入(import)就可以了。下面继续看例子:

内联导出

ES6模块里的对象可在创建它们的声明中直接导出,一个模块中可无数次使用export。

先看模块文件app.js

export class Human{
constructor(name) {
this.name = name;
}
breathe() {
console.log(this.name + " is breathing");
}
}
export function run(){
console.log('i am runing');
}
function eat() {
console.log('i am eating');
}

例子中的模块导出了两个对象:Human类和run函数, eat函数没有导出,则仍为此模块私有,不能被其他文件使用。

导出一组对象

另外,其实如果需要导出的对象很多的时候,我们可以在最后统一导出一组对象。

更改app.js文件:

class Human{
constructor(name) {
this.name = name;
}
breathe() {
console.log(this.name + " is breathing");
}
}
function run(){
console.log('i am runing');
}
function eat() {
console.log('i am eating');
}
export {Human, run};

这样的写法功能和上面一样,而且也很明显,在最后可以清晰的看到导出了哪些对象。

Default导出

导出时使用关键字default,可将对象标注为default对象导出。default关键字在每一个模块中只能使用一次。它既可以用于内联导出,也可以用于一组对象导出声明中。

查看导出default对象的语法:

...   //创建类、函数等等
export default { //把Human类和run函数标注为default对象导出。
Human,
run
};

无对象导入

如果模块包含一些逻辑要执行,且不会导出任何对象,此类对象也可以被导入到另一模块中,导入之后只执行逻辑。如:

import './module1.js';

导入默认对象

使用Default导出方式导出对象,该对象在import声明中将直接被分配给某个引用,如下例中的“app”。

import app from './module1.js';

上面例子中,默认./module1.js文件只导出了一个对象;若导出了一组对象,则应该在导入声明中一一列出这些对象,如:

import {Human, run} from './app.js'

let与const

在我看来,在es6新特性中,在定义变量的时候统统使用let来代替var就好了,const则很直观,用来定义常量,即无法被更改值的变量。

for (let i=0;i<2;i++) {
console.log(i); //输出: 0,1
}

箭头函数

ES6中新增的箭头操作符=>简化了函数的书写。操作符左边为输入的参数,而右边则是进行的操作以及返回的值,这样的写法可以为我们减少大量的代码,看下面的实例:

let arr = [6, 8, 10, 20, 15, 9];
arr.forEach((item, i) => console.log(item, i));
let newArr = arr.filter((item) => (item<10));
console.log(newArr); //[6, 8, 9];

上面的(item, i)就是参数,后面的console.log(item, i)就是回到函数要执行的操作逻辑。

上面代码转为js格式:

var arr = [6, 8, 10, 20, 15, 9];
arr.forEach(function(item, i) {
return console.log(item, i);
});
var newArr = arr.filter(function(item) {
return (item < 10);
});
console.log(newArr);

字符串模版

ES6中允许使用反引号 ` 来创建字符串,此种方法创建的字符串里面可以包含由美元符号加花括号包裹的变量${vraible}。看一下实例就会明白了:

//产生一个随机数
let num = Math.random();
//将这个数字输出到console
console.log(`your num is ${num}`);

解构

若一个函数要返回多个值,常规的做法是返回一个对象,将每个值做为这个对象的属性返回。在ES6中,利用解构这一特性,可以直接返回一个数组,然后数组中的值会自动被解析到对应接收该值的变量中。我们来看例子:

function getVal() {
return [1, 2];
}
var [x,y] = getVal(); //函数返回值的解构
console.log('x:'+x+', y:'+y); //输出:x:1, y:2

默认参数

现在可以在定义函数的时候指定参数的默认值了,而不用像以前那样通过逻辑或操作符来达到目的了。

function sayHello(name){
var name=name||'tom'; //传统的指定默认参数的方式
console.log('Hello '+name);
}
//运用ES6的默认参数
function sayHello2(name='tom'){ //如果没有传这个参数,才会有默认值,
console.log(`Hello ${name}`);
}
sayHello();//输出:Hello tom
sayHello('jarson');//输出:Hello jarson
sayHello2();//输出:Hello tom
sayHello2('jarson');//输出:Hello jarson

注意: sayHello2(name='tom')这里的等号,意思是没有传这个参数,则设置默认值,而不是给参数赋值的意思。

Proxy

Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作。一下子让我们对一个对象有了很强的追踪能力,同时在数据绑定方面也很有用处。

//定义被监听的目标对象
let engineer = { name: 'Joe Sixpack', salary: 50 };
//定义处理程序
let interceptor = {
set(receiver, property, value) {
console.log(property, 'is changed to', value);
receiver[property] = value;
}
};
//创建代理以进行侦听
engineer = new Proxy(engineer, interceptor);
//做一些改动来触发代理
engineer.salary = 70;//控制台输出:salary is changed to 70

对于处理程序,是在被监听的对象身上发生了相应事件之后,处理程序里面的方法就会被调用。

结语

总的来说,虽然支持es6的情况到目前还不是很乐观,但es6的新语法特性让前端和后端的差异越来越小了,这是一个新时代的开始,我们必须要了解这些新的前沿知识,才能跟上时代的步伐。

总结常见的ES6新语法特性的更多相关文章

  1. 总结常见的ES6新语法特性。

    前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数 ...

  2. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

    回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...

  3. ES6入门五:箭头函数、函数与ES6新语法

    箭头函数的基本用法与特点 函数与ES6新语法 一.箭头函数的基本用法与特点 声明箭头函数采用声明变量和常量的关键字:var.let.const 箭头函数的参数:没有参数用"()"空 ...

  4. ES6新语法

    ES6新语法概览 简介 ES6是JavaScript语言的新一代标准,加入了一些新的功能和语法,正式发布于2015年6月,亦称ES2015:该标准由ECMA(欧洲计算机制造联合会)的第39号技术专家委 ...

  5. ES6新语法的介绍

    对于ES6新语法,阮一峰有一篇文章介绍的挺详细 http://es6.ruanyifeng.com/#docs/destructuring

  6. ES6新语法之let关键字;有别于传统关键字var的使用

    ES6新语法于2015年发布:而我这个前端小白在17年才接触到.惭愧惭愧!!不过到目前为止,似乎只有FireFox和Chrome对ES6的支持相对良好.不过既然人家ES6已经出来了,还是要跟上技术的潮 ...

  7. Delphi 7以来的Delphi 2009测试版新语法特性

    我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...

  8. C#新语法特性前瞻

    今天逛微软的UserVoice site发现了几个有很有用,也很可能被添加到新版C#中的语法,当然也可能被推迟到下一版,拿出来给大家分享一下. 另外还没投票的可以去为自己最想要的新特性投票,有兴趣的可 ...

  9. ES6 | ES6新语法 在编码实践中的应用

    本章探讨如何将 ES6 的新语法,运用到编码实践之中,与传统的 JavaScript 语法结合在一起,写出合理的.易于阅读和维护的代码. 多家公司和组织已经公开了它们的风格规范,本文的内容主要参考了  ...

随机推荐

  1. Python 日志模块 logging通过配置文件方式使用

    vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...

  2. slave IO流程之一:mysql登陆过程(mysql_real_connect)

    最近看了slave IO的源码,发现slave IO的写relay log貌似是单线程单连接的,这让我有点小失望. slave IO的主函数是handle_slave_io,处理流程如下: 图1 ha ...

  3. CATransition转场动画

    背景: 最近在温习动画,分享个简单系统的转场动画 viewcontroller *VC=[self.storyboard instantiateViewControllerWithIdentifier ...

  4. 【.NET深呼吸】存储基于本地线程的值

    在特定情况,我们希望这样一个场景: N个线程同时调用同一个类实例的同一个操作方法,并且同一个变量可以面向每一个线程存储独立的值.比如,某变量X,它对于线程A的值与对于线程B的值是相互独立的.线程A设置 ...

  5. jQuery源码分析系列(38) : 队列操作

    Queue队列,如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施 Queue队列是animate动画依赖的基础设施,整个jQuery中队列仅供给动画使用 Qu ...

  6. 让低版本的 Android 项目显示出 Material 风格的点击效果

    每天都被不同的需求纠缠的生活是幸福而又不幸的,这不我们家亲爱的设计师们又让我们在低版本的 Android 平台上实现一下类似于 Material Design 的点击效果. 虽然大家都知道 Mater ...

  7. Building OpenCascade on Windows with Visual Studio

    Building OpenCascade on Windows with Visual Studio eryar@163.com 摘要Abstract:详细说明OpenCascade的编译配置过程,希 ...

  8. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  9. 前端学php之常量

    × 目录 [1]定义常量 [2]常量检测 [3]系统常量[4]魔术常量 前面的话 常量在javascript中并不存在,在php中却是与变量并列的重要内容.常量类似变量,但常量一旦被定义就无法更改或撤 ...

  10. 比较一下以“反射”和“表达式”执行方法的性能差异

    由于频繁地使用反射会影响性能,所以ASP.NET MVC采用了表达式树的方式来执行目标Action方法.具体来说,ASP.NET MVC会构建一个表达式来体现针对目标Action方法的执行,并且将该表 ...