把JavaScript代码改成ES6语法不完全指南
目录
* 核心例子
* 修改成静态变量(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的探索,还会继续保存更新。
来关注一下前端进阶指南微信公众号吧:
另外我也创了一个对应的QQ群:660112451,欢迎一起交流。
注:以上ES6语法为作者日常使用较为频繁的语法,未将所有ES6语法囊括在内。感谢你的阅读。
把JavaScript代码改成ES6语法不完全指南的更多相关文章
- 超实用的 JavaScript 代码片段( ES6+ 编写)
Array 数组 Array concatenation (数组拼接) 使用 Array.concat() ,通过在 args 中附加任何数组 和/或 值来拼接一个数组. const ArrayCon ...
- 精心收集的 95 个超实用的 JavaScript 代码片段( ES6+ 编写)
https://www.html.cn/archives/8748#table-of-contents https://www.haorooms.com/post/js_regexp
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...
- 使用webpack+babel构建ES6语法运行环境
1.前言 由于ES6语法在各个浏览器上支持的情况各不相同,有的浏览器对ES6语法支持度较高,而有的浏览器支持较低,所以为了能够兼容大多数浏览器,我们在使用ES6语法时需要使用babel编译器将代码中的 ...
- python学习——将while循环改成函数
笨办法学python第33节 这一节主要学习内容是while循环,记录内容为将while改成函数,首先源代码如下: i = 0 numbers = [] while i < 6: print & ...
- vue 2.0 无法编译ES6语法
# vue2.0 webpack 无法编译 ES6 语法 之前在使用 vue 1.x 时用 vue-loader@8.0.0 版本可以正常打包vue的代码,包括ES6语法也能正常转为ES5语法,但是当 ...
- 把纯C的动态库代码改造成C++版的
近期想把一份纯C的跨Win/Linux的动态库工程代码改成支持C++编译器,这样用C++写起代码来比较顺手.要点是保证动态库的ABI一致性,既导出接口不能改变. 主要的改动有: 1.把.c后缀名换成. ...
- 使用C#解析并运行JavaScript代码
如果想在C#编程中解析并运行JavaScript代码,常见的方式有两种: 利用COM组件“Microsoft Script Control”,可参见:C#使用技巧之调用JS脚本方法一 利用JScrip ...
- [转]用AOP改善javascript代码
有时候,不光要低头写代码,也要学着站在更高的角度,来思考代码怎么写,下面这篇文章,讲的关于代码设计的问题,脑洞大开. 原文: http://www.alloyteam.com/2013/08/yong ...
随机推荐
- 会话跟踪Cookie与Session
会话跟踪用来跟踪用户的整个会话,常用的是Session和Cookie.Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie 1.1概念及使 ...
- salesforce零基础学习(七十六)顺序栈的实现以及应用
数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...
- Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案
注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的d ...
- Unity 发布的 WebGL 使用SendMessage传递多个参数
如果要实现Unity与浏览器的数据交互一般都会采用两种方式 方法一: Application.ExternalCall("SayHello","helloworld&qu ...
- swift UITextField光标聚焦以及光标颜色修改
光标聚焦闪烁: nick_textField.becomeFirstResponder() 光标颜色修改 nick_textField.tintColor = UIColor.red 备份:http: ...
- UIButton防止被重复点击
一.避免屏幕内多个 UIButton 被重复点击 1.在 AppDelegate 中添加[[UIButton appearance] setExclusiveTouch:YES]; 2.button. ...
- css小随笔(二)与通用样式
51先在学校HTML5已经有半个多月了,然后这个星期做了一个京东的手机网站,接触到了通用样式,下面以京东的手机站为例 这两个就是京东手机站了的不同的两个板块,因为HTML5仅仅只是学完了基本标签跟cs ...
- [算法题] 3Sum Closest
题目内容 Given an array S of n integers, find three integers in S such that the sum is closest to a give ...
- 借助AMD来解决HTML5游戏开发中的痛点
借助AMD来解决HTML5游戏开发中的痛点 游戏开发的痛点 现在,基于国内流行引擎(LayaAir和Egret)和TypeScript的HTML5游戏开发有诸多痛点: 未采用TypeScript编译器 ...
- Python实现登录接口
要求: 输入用户名和密码 认证成功,显示欢迎信息 用户名3次输入错误后,退出程序 密码3次输入错误后,锁定用户名 Readme: UserList.txt 是存放用户名和密码的文件,格式为:usern ...