ES6的新特性:
- 变量
- 函数
- 数组
- 字符串
- 面向对象
- Promise
- generator
- 模块化
解决兼容性
在线转换:使用相关库进行转换,每次用户加载的时候进行实时转换
1
2
3
4
5
6
7
8
9
10<head>
<title></title>
<!-— brower.js 就是babel.js的别名 -->
<script src="browser.js" charset="utf-8"></script>
<script type="text/babel">
let a = 12;
let b = 14;
alert(a + b)
</script>
</head>提前编译
let和const
var的弊端
可以重复声明
1
2
3
4var a = 2
var a = 3 // 注意不是 a = 3;a = 3是重新赋值
alert(a) // 3无法限制修改:没有常量定义
没有块级作用域:var是全局作用域
1
2
3
4if (true) {
var a = 2
}
alert(a) // 2
let和const的特性
- 不能重复声明
- 限制修改
- 块级作用域
箭头函数
- 如果函数只有一个参数,
()
可以参略 - 如果函数的函数体只有一行return,
{}
可以省略
函数参数
参数扩展(
Rest Parameter
)- 就是python里的可变参数
- 和python一样,args必须是最后一个参数
1
2
3
4def show(a, b, *args):
print(a)
print(b)
print(args)1
2
3
4
5const show = (a, b, ...args) => {
console.log(a)
console.log(b)
console.log(args)
}数组展开
- 和python的元祖拆包一摸一样
1
2
3
4
5
6
7
8
9
10
11const show = (a, b ,c) => {
alert(a)
alert(b)
alert(c)
}
const arr = [1, 2, 3]
show(1,2,3)
// 上一行等价于
show(...arr)默认参数
- 和python的默认参数一摸一样
1
2
3const show = (a, b=2, c=5) => {
console.log(a, b, c)
}
解构赋值
和python的元祖赋值一摸一样,但是js的解构赋值更加智能:
- 左右两边的结构必须一样
- 声明和赋值不能分开
1 | let arr = [1, 2, 3] |
解构JS对象
1 | const myfunc = ({name}) => { |
组数的四个方法
- map
- reduce:相比于python,多了一个第三参数(index)
- filter
- forEach
1 | let arr = [1,2,3] |
字符串模版和字符串的两个方法
字符串的两个方法:
- startsWith
- endsWith
1 | let mystr = "qwe123" |
字符串模版:
1 | let a = 12 |
面向对象
class关键字
1 | // JS传统面向对象 |
继承
1 | // JS传统继承 |
this
- constructor里面的this指向实例对象,方法里面的this指向这个方法的调用者
1 | class Star { |
配合React使用
1 | <head> |
json
- JSON对象的序列化方法和反序列化方法
- json简写
- 名字一样时的简写
- 方法的简写
JSON对象的序列化方法和反序列化方法:
1 | let json = {a:12, b:5} |
简写:
1 | let a = 12 |
Promise
- 以同步的方式编写异步代码
简单使用
1 | let p = new Promise(function(resovle, reject){ |
多个promise对象
1 | let p1 = new Promise(function(resovle, reject){ |
进一步简化
1 | const createPromise = (url) => { |
其实,对于高版本的JQuery来说,
$.Ajax()
的返回值就是Promise对象
1
2
3
4
5
6
7
8 Promise.all([
$.Ajax({url:"http://baidu.com",dataType:"json"}),
$.Ajax({url:"http://taobao.com",dataType:"json"}),
]).then(results => {
alert("全部成功了")
},err => {
alert("至少有一个失败了")
})
Promise对象的其他方法
- all():全部都执行
- race():竞速,就是都是发出多个请求,哪一个先执行完毕就哪一个执行then函数,其余的放弃
1 | // 同时请求m1-m4,哪个最先成功了就处理哪个,其余放弃 |
generator
- 和python的生成器一摸一样
1 | function *show(){ |
yield
- 和python一样,既可以传参,也可以返回
1 | function *show(){ |
ES6的yield返回值和python些许不同,ES6返回的是对象,包含done属性
1 | function *show() { |
yield使用
- 和python的ascync和await一摸一样
1 | // runner是runner.js的函数 |
async和await使用
1 | // 上面代码可以改成async和await关键字 |
还可以使用箭头函数:
1 | // 上面代码可以改成async和await关键字 |
模块化之export和import的用法
ES6中export和import一般的用法有两种
- 命名导出(Named exports)
- 默认导出(Default exports)
命名导出(Named exports)
- 每一个需要导出的数据类型都要有一个name,统一引入一定要带有
{}
,即便只有一个需要导出的数据类型。 - 这种写法清爽直观,是推荐的写法。
1 | //------ lib.js ------ |
把export直接加到声明前面就可以省略{}
1 | //------ lib.js ------ |
无论怎样导出,引入的时候都需要{}
。
别名引入(Aliasing named imports)
当从不同模块引入的变量名相同的时候,这些写法显然会造成混乱
1 | import {speak} from './cow.js' |
命名空间引入(Namespace imports)
1 | import * as cow from './cow.js' |
默认导出(Default exports)
默认导出就不需要name了,但是一个js文件中只能有一个export default。
1 | //------ myFunc.js ------ |
其实这种导出方式可以看成是命名导出的变种,只不过把命名写成了default。
虽然export default只能有一个,但也可以导出多个方法。
1 | export default { |