前端开发不得不知的10个最佳ES6特性


Posted in Javascript onAugust 30, 2017

为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。

ES6,正式名称是ECMAScript2015,但是ES6这个名称更加简洁。ES6已经不再是JavaScript最新的标准,但是它已经广泛用于编程实践中。如果你还没用过ES6,现在还不算太晚…

下面是10个ES6最佳特性,排名不分先后:

  • 函数参数默认值
  • 模板字符串
  • 多行字符串
  • 解构赋值
  • 对象属性简写
  • 箭头函数
  • Promise
  • Let与Const
  • 模块化
  • 函数参数默认值
  • 不使用ES6

为函数的参数设置默认值:

function foo(height, color)
{
 var height = height || 50;
 var color = color || 'red';
 //...
}

这样写一般没问题,但是,当参数的布尔值为false时,是会出事情的!比如,我们这样调用foo函数:

foo(0, "", "")

因为0的布尔值为false,这样height的取值将是50。同理color的取值为‘red'。

使用ES6

function foo(height = 50, color = 'red')
{
 // ...
}

模板字符串

不使用ES6

使用+号将变量拼接为字符串:

var name = 'Your name is ' + first + ' ' + last + '.'

使用ES6

将变量放在大括号之中:

var name = `Your name is ${first} ${last}.`

ES6的写法更加简洁、直观。

多行字符串

不使用ES6

使用“\n\t”将多行字符串拼接起来:

var roadPoem = 'Then took the other, as just as fair,\n\t'
 + 'And having perhaps the better claim\n\t'
 + 'Because it was grassy and wanted wear,\n\t'
 + 'Though as for that the passing there\n\t'
 + 'Had worn them really about the same,\n\t'

使用ES6

将多行字符串放在反引号“之间就好了:

var roadPoem = `Then took the other, as just as fair,
 And having perhaps the better claim
 Because it was grassy and wanted wear,
 Though as for that the passing there
 Had worn them really about the same,`

解构赋值

不使用ES6

当需要获取某个对象的属性值时,需要单独获取:

var data = $('body').data(); // data有house和mouse属性
var house = data.house;
var mouse = data.mouse;

使用ES6

一次性获取对象的子属性:

var { house, mouse} = $('body').data()

对于数组也是一样的:

var [col1, col2] = $('.column');

对象属性简写

不使用ES6

对象中必须包含属性和值,显得非常多余:

var bar = 'bar';
var foo = function ()
{
 // ...
}
var baz = {
 bar: bar,
 foo: foo
};

使用ES6

对象中直接写变量,非常简单:

var bar = 'bar';
var foo = function ()
{
 // ...
}
var baz = { bar, foo };

箭头函数

不使用ES6

普通函数体内的this,指向调用时所在的对象。

function foo() 
{
 console.log(this.id);
}
var id = 1;
foo(); // 输出1
foo.call({ id: 2 }); // 输出2

使用ES6

箭头函数体内的this,就是定义时所在的对象,而不是调用时所在的对象。

var foo = () => {
 console.log(this.id);
}
var id = 1;
foo(); // 输出1
foo.call({ id: 2 }); // 输出1

Promise

不使用ES6

嵌套两个setTimeout回调函数:

setTimeout(function()
{
 console.log('Hello'); // 1秒后输出"Hello"
 setTimeout(function()
 {
  console.log('Fundebug'); // 2秒后输出"Fundebug"
 }, 1000);
}, 1000);

使用ES6

使用两个then是异步编程串行化,避免了回调地狱:

var wait1000 = new Promise(function(resolve, reject)
{
 setTimeout(resolve, 1000);
});
wait1000
 .then(function()
 {
  console.log("Hello"); // 1秒后输出"Hello"
  return wait1000;
 })
 .then(function()
 {
  console.log("Fundebug"); // 2秒后输出"Fundebug"
 });

Let与Const

使用Var

var定义的变量未函数级作用域:

{
 var a = 10;
}
console.log(a); // 输出10

使用let与const

let定义的变量为块级作用域,因此会报错:(如果你希望实时监控JavaScript应用的错误,欢迎免费使用Fundebug)

{
 let a = 10;
}
console.log(a); // 报错“ReferenceError: a is not defined”

const与let一样,也是块级作用域。

不使用ES6

使用构造函数创建对象:

function Point(x, y)
{
 this.x = x;
 this.y = y;
 this.add = function()
 {
  return this.x + this.y;
 };
}
var p = new Point(1, 2);
console.log(p.add()); // 输出3

使用ES6

使用Class定义类,更加规范,且你能够继承:

class Point
{
 constructor(x, y)
 {
  this.x = x;
  this.y = y;
 }
 add()
 {
  return this.x + this.y;
 }
}
var p = new Point(1, 2);
console.log(p.add()); // 输出3

模块化

JavaScript一直没有官方的模块化解决方案,开发者在实践中主要采用CommonJS和AMD规范。而ES6制定了模块(Module)功能。

不使用ES6

Node.js采用CommenJS规范实现了模块化,而前端也可以采用,只是在部署时需要使用Browserify等工具打包。这里不妨介绍一下CommenJS规范。

module.js中使用module.exports导出port变量和getAccounts函数:

module.exports = {
 port: 3000,
 getAccounts: function() {
 ...
 }
}

main.js中使用require导入module.js:

var service = require('module.js')
console.log(service.port) // 输出3000

使用ES6

ES6中使用export与import关键词实现模块化。

module.js中使用export导出port变量和getAccounts函数:

export var port = 3000
export function getAccounts(url) {
 ...
}

main.js中使用import导入module.js,可以指定需要导入的变量:

import {port, getAccounts} from 'module'
console.log(port) // 输出3000

也可以将全部变量导入:

import * as service from 'module'
console.log(service.port) // 3000

总结

以上所述是小编给大家介绍的前端开发不得不知的10个最佳ES6特性,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js变量作用域及可访问性的探讨
Nov 23 Javascript
javascript中的prototype属性使用说明(函数功能扩展)
Aug 16 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
Dec 11 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
Nov 20 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
Jul 27 Javascript
Bootstrap导航条学习使用(一)
Feb 08 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
Mar 21 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 Javascript
Vue列表渲染的示例代码
Nov 01 Javascript
Vuex 使用 v-model 配合 state的方法
Nov 13 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 Javascript
在vue中实现给每个页面顶部设置title
Jul 29 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 #Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 #Javascript
详解使用nvm管理多版本node的方法
Aug 30 #Javascript
jquery插件开发之选项卡制作详解
Aug 30 #jQuery
浅谈angular.js跨域post解决方案
Aug 30 #Javascript
详解a++和++a的区别
Aug 30 #Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
Aug 30 #Javascript
You might like
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
[01:16:28]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第二场 2月23日
2021/03/11 DOTA
python re正则表达式模块(Regular Expression)
2014/07/16 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
韩国现代百货官网:Hmall
2018/03/21 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
进步之星获奖感言
2014/02/22 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
新学期教师寄语
2014/04/02 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
原告代理词范文
2015/05/25 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers