把JavaScript代码改成ES6语法不完全指南(分享)


Posted in Javascript onSeptember 10, 2017

目录

* 核心例子
* 修改成静态变量(const)或块级变量(let)
 * 开始修改
 * 疑问解释(重复定义会发生什么)
 * 疑问解释(let的块级作用域是怎样的)
 * 疑问解释(const定义的变量在基础数据类型和引用类型中的差异)
* 修改成Promise的形式
 * 预备知识(回调函数是什么)
 * 预备知识(如何把回调函数改为Promise)
 * 开始修改
* 修改成箭头函数(Arrow Function)
 * 预备知识(箭头函数是什么)
 * 预备知识(箭头函数函数中的this是个坑)
 * 开始修改
* 修改拼接字符串成模板字符串
 * 预备知识(字符串的拼接方式)
 * 预备知识(改为模板字符串的方式)
 * 开始修改
* 修改成解构的对象
* 修改成Class

核心例子

文中的例子,请在最新的Chrome中测试。关于配置ES6转ES5的环境,不在本文探讨的范畴。

// 定义一个学生构造函数
var People = function(name, age) {
 this.name = name
 this.age = age
}

// 创建小明实例
var xiaoming = new People('xiaoming', 18)

// 定义一个考试函数
// 定义两个回调函数,在适当的时候把参数传进去
var examStart = function(callbackSucc, callbackFail) {
 var result = prompt('1+5=')
 if(result === '6') {
 callbackSucc('Awesome. Your answer is ' + result)
 }
 else {
 callbackFail('You can try again. Your answer is ' + result)
 }
}

// 开始考试
// 传入的两个回调函数分别处理结果
examStart(function(res) {
 console.log(res)
}, function(res) {
 console.log(res)
})

修改成静态变量(const)或块级变量(let)

当你变量的值需要修改的时候,应该使用块级变量(let)。其他时候,使用静态变量(const)。

无论是静态变量(const)还是块级变量(let),都不能重复定义,否则会报错。

静态变量(const)一旦定义,数据类型不可更改。但是引用类型,如Array,Object,都可以用相应的原型方法对数据的内部进行操作。

开始修改

我们这里定义的变量都不需要修改,所以直接全部改为const。在项目中,判断是改为const还是let有一个技巧,可以使用编辑器的变量复选功能(如,sublime中是双击变量名之后ctrl+d)。然后判断代码中是否对这个变量进行过赋值,以及根据自己的判断是否需要对这个变量进行修改,不需要则用const。

// 修改一 var ==> const
const Student1 = function(name, age) {
 this.name = name
 this.age = age
}

// 修改二 var ==> const
const xiaoming1 = new Student1('xiaoming', 18)

// 修改三 var ==> const
const examStart1 = function(callbackSucc, callbackFail) {
 // 修改四 var ==> const
 const result = prompt('1+5=')
 if(result === '6') {
 callbackSucc('Awesome. Your answer is ' + result)
 }
 else {
 callbackFail('You can try again. Your answer is ' + result)
 }
}

examStart1(function(res) {
 console.log(res)
}, function(res) {
 console.log(res)
})

疑问解释(重复定义会发生什么)

const author = 'bw2'
const author = 'bw3' // Uncaught SyntaxError: Identifier 'author' has already been declared
let author = 'bw4' // Uncaught SyntaxError: Identifier 'author' has already been declared

疑问解释(let的块级作用域是怎样的)

// let定义的变量存在块级作用域
if(true) {
 let test1 = 2333
}
console.log(test1) // Uncaught ReferenceError: t is not defined


// var定义的变量不存在,会直接成为全局变量
if(true) {
 var test2 = 2333
}
console.log(test2) // 2333

疑问解释(const定义的变量在基础数据类型和引用类型中的差异)

开始例子之前,先回顾以下基础数据类型。Number、String、Boolean、null、undefined、Symbol。其中Symbol是ES6新加的。除基础数据类型外,皆为引用类型。常见的引用类型是Array,Object。

// const定义的变量值是基础数据类型时,不能修改值,也不能修改类型
const num = 2333
num = 2334 // Uncaught TypeError: Assignment to constant variable.
num = '' // Uncaught TypeError: Assignment to constant variable.

// const定义的变量值是引用类型时,可以修改值
const obj = {}
obj.test = 2333
console.log(obj.test) // 2333

const arr = []
arr.push(1)
console.log(arr) // [1]

修改成Promise的形式

从应用的角度上来讲,Promise的主要作用是可以把回调函数,改为链式调用的模式。

当存在多个嵌套的回调函数时,代码的缩进层级将会非常多,不利于阅读。这时Promise就登场了。

如果只有一个回调函数,不涉及到错误处理,则不建议修改为Promise的形式。

预备知识(回调函数是什么)

回调函数是指,定义一个函数,传入的参数是一个函数。然后在函数中特定的位置,执行这个传入的函数,并将需要用到的数据,作为参数传入。回调函数常见于异步编程。比如发送Ajax请求和NodeJS中的异步文件操作。百闻不如一见,我们看个最简单的例子吧。

// 定义一个支持传入回调函数的函数
function fun1(callback) {
 // 执行传入的函数,并将值2333作为参数传入
 callback(2333)
}

// 执行定义的函数
fun1(function(res){
 // 输出传入的参数
 console.log(res)
})

预备知识(如何把回调函数改为Promise)

这里只是为了举个例子,不涉及错误处理的时候,不建议修改为Promise。

function fun2() {
 // 在函数中返回一个Promise对象
 // resolve和reject都是函数
 return new Promise(function(resolve, reject){
 // resolve函数中的参数将会出现在.then方法中
 // reject函数中的参数将会出现在.ctch方法中
 resolve(2333)
 })
}

fun2().then(function(res){
 console.log(res) // 2333
})

开始修改

Promise是通过resolve和reject来分别把正确结果,和错误提示放在链式调用的.then和.catch方法里。

const examStart2 = function() {
 // 返回一个Promise对象
 return new Promise(function(resolve, reject) {
 var result = prompt('1+5=')
 if(result === '6') {
  resolve('Awesome. Your answer is ' + result)
 }
 else {
  reject('You can try again. Your answer is ' + result)
 }
 })
}
examStart2()
.then(function(res) {
 console.log(res)
})
.catch(function(err) {
 console.log(err)
})

修改成箭头函数(Arrow Function)

预备知识(箭头函数是什么)

箭头函数是一个用来帮我们简化函数结构的一个小工具。

// 普通函数形式
const add1 = function(a, b) {
 return a + b
}
add1(1, 2) // 3

// 箭头函数形式
const add2 = (a, b) => a + b
add2(1, 2) // 3

预备知识(箭头函数函数中的this是个坑)

// 箭头函数没有独立的this作用域
const obj1 = {
 name: 'bw2',
 showName: () => {
 return this.name
 }
}
obj1.showName() // ""

// 解决方案:改为function模式
const obj2 = {
 name: 'bw2',
 showName: function() {
 return this.name
 }
}
obj2.showName() // "bw2"

开始修改

var examStart3 = function() {
 // 修改一
 return new Promise((resolve, reject) => {
 var result = prompt('1+5=')
 if(result === '6') {
  resolve('Awesome. Your answer is ' + result)
 }
 else {
  reject('You can try again. Your answer is ' + result)
 }
 })
}
// 修改二
examStart3().then((res) => console.log(res)).catch((err) => console.log(err))

修改拼接字符串成模板字符串

预备知识(字符串的拼接方式)

const xh1 = 'xiaohong'
console.log('I\'m ' + xh1 + '.') // I'm xiaohong.

预备知识(改为模板字符串的方式)

字符串模板使用的不再是单引号了,是在英文输入状态下的`键(ESC下面那个)。

const xh2 = 'xiaohong'
console.log(`I'm ${xh2}.`) // I'm xiaohong.

开始修改

var examStart4 = function() {
 return new Promise((resolve, reject) => {
 var result = prompt('1+5=')
 if(result === '6') {
  // 修改一
  resolve(`Awesome. Your answer is ${result}`)
 }
 else {
  // 修改二
  reject(`You can try again. Your answer is ${result}`)
 }
 })
}
examStart4().then((res) => console.log(res)).catch((err) => console.log(err))

修改成解构的对象

对象解构常用在NodeJS导入包内的某个模块时。对于自己写的对象,如果需要进行解构,则要确保对象内的命名被解构出来不会造成冲突。这里是为了举例子方便,没有使用很独特的命名。

const People2 = function(name, age) {
 this.name = name
 this.age = age
}
const xiaoming2 = new People2('xiaoming2', 18)

// 开始结构
const {name, age} = xiaoming2
// 现在可以独立访问了
console.log(name) // xiaoming2
console.log(age) // 18

修改成Class

类是一个语法糖,但是这并不妨碍我们去食用他。

在React中,模板的定义,通常是类,生命周期方法也是写在类中。

class People3 {
 constructor(name, age){
 this.name = name
 this.age = age
 }
 showName() {
 return this.name
 }
}

const xiaoming3 = new People3('xiaoming3', 18)
console.log(xiaoming3) // People {name: "xiaoming3", age: 18}
console.log(xiaoming3.showName()) // xiaoming3

不过瘾?文章已经结束了。但是关于ES6的探索,还会继续保存更新。

以上这篇把JavaScript代码改成ES6语法不完全指南(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
[JS]点出统计器
Oct 11 Javascript
jQuery Ajax使用 全解析
Dec 15 Javascript
基于jquery的$.ajax async使用
Oct 19 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
Mar 01 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
Apr 01 Javascript
js的匿名函数使用介绍
Dec 11 Javascript
基于javascript html5实现多文件上传
Mar 03 Javascript
JavaScript中removeChild 方法开发示例代码
Aug 15 Javascript
javascript中href和replace的比较(详解)
Nov 25 Javascript
JavaScript实现网页头部进度条刷新
Apr 16 Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 Javascript
vue实现lodop打印功能的示例
Nov 11 Javascript
js 发布订阅模式的实例讲解
Sep 10 #Javascript
node.js 发布订阅模式的实例
Sep 10 #Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 #Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
Sep 10 #Javascript
基于AngularJS的简单使用详解
Sep 10 #Javascript
JS获取字符对应的ASCII码实例
Sep 10 #Javascript
Angular4学习笔记之根模块与Ng模块
Sep 09 #Javascript
You might like
人族 Terran 基本策略
2020/03/14 星际争霸
php 方便水印和缩略图的图形类
2009/05/21 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
python实现五子棋小游戏
2020/03/25 Python
Python中正则表达式的用法总结
2019/02/22 Python
PyQt5实现简易电子词典
2019/06/25 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
安全大检查反思材料
2014/01/31 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
商标侵权律师函
2015/05/27 职场文书
新郎婚礼致辞
2015/07/27 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python