目录
  1. 1. 变量
    1. 1.1. var
    2. 1.2. let
    3. 1.3. const
  2. 2. 函数
    1. 2.1. 函数的参数
  3. 3. 解构赋值
  4. 4. 数组
    1. 4.1. map 映射
    2. 4.2. reduce 汇总
    3. 4.3. filter 过滤器
    4. 4.4. forEach 循环(迭代)
  5. 5. 字符串
    1. 5.1. 字符串连接
  6. 6. 面向对象
    1. 6.1. 面向对象应用 —— React
  7. 7. JSON
    1. 7.1. json的标准写法
  8. 8. Promise
    1. 8.1. Promise —— 清除异步操作
    2. 8.2. Promise.race 竞速
  9. 9. generator —— 生成器
    1. 9.1. yield
    2. 9.2. Promise —— 用于批量读取
    3. 9.3. generator —— 逻辑性用于逻辑性读取
    4. 9.4. koa
  10. 10. ES7预览
    1. 10.1. 数组 includes
    2. 10.2. 数组 keys/values/entries
    3. 10.3.
    4. 10.4. padStart/padEnd
    5. 10.5. async await
ES6基本语法

ES6(ES2015)支持IE10+,Chrome,FireFox,移动端,NodeJS

转换方式
1.在线转换
2.提前编译(推荐)


变量

var
  1. 可以重复声明
  2. 无法限制修改
  3. 没有块级作用域
let

不能重复声明,变量-可以修改,有块级作用域

const

不能重复声明,常量-不能修改,有块级作用域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
window.onload = function (){
var aBtn = document.getElementsByTagName('input');

for (var i=0; i<aBtn.length; i++){
aBtn[i].onclick = function (){
alert(i);
}
}
}
输出结果:3 3 3

window.onload = function (){
var aBtn = document.getElementsByTagName('input');

for (var i=0; i<aBtn.length; i++){
(function (i){
aBtn[i].onclick = function (){
alert(i);
};
})(i);
}
}
输出结果:1 2 3

window.onload = function (){
var aBtn = document.getElementsByTagName('input');

for (let i=0; i<aBtn.length; i++){
aBtn[i].onclick = function (){
alert(i);
}
}
}
输出结果:1 2 3

函数

  1. 如果只有一个参数,()可以省
  2. 如果只有一个return,{}可以省
1
2
3
4
function show(a){return a*2}
(a)=>{return a*2}
a=>{return a*2}
a=>a*2
函数的参数
  1. 参数扩展/数组展开
1
2
3
4
5
//收集参数
function show(a, b, ...args){} //Rest Parameter必须是最后一个

//展开数组
alert(args); //[] //展开后的效果,跟直接把数组的内容写在这一样
  1. 默认参数

解构赋值

  1. 左右两边结构必须一样
  2. 右边必须是个东西
  3. 声明和赋值不能分开(必须在一句话里完成)
1
2
let [a, b, c] = [12, 5, 8];
let {a, b, c} = {a:12, b:5, c:8};

数组

map 映射
1
2
3
4
let score = [19, 85, 99, 25, 90]
let result = score.map(item=>item>=60?"及格":"不及格");
alert(score);
alert(result);
reduce 汇总
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//算总数
let arr = [12, 69, 180, 8763];
let result = arr.reduce(function (tmp, item, index){
return tmp+item;
});
alert(result);

//算平均数
let arr = [12, 69, 180, 8763];
let result = arr.reduce(function (tmp, item, index){
if (index != arr.length-1){
return tmp+item;
} else {
return (tmp+item)/arr.length;
}
});
alert(result);
filter 过滤器
1
2
3
4
5
6
7
8
9
10
let arr = [
{title:'包1', price:35},
{title:'包2', price:45},
{title:'包3', price:55},
{title:'包4', price:75}
];

let result = arr.filter(json=>json.price>=55);

alert(result);
forEach 循环(迭代)
1
2
3
4
5
let arr = [12, 5, 8, 9];

arr.forEach((item, index)=>{
alert(index + ":" + item);
});

字符串

  1. 两个新方法

startsWith

1
2
var str = 'http://www.baidu.com';
str.startsWith('http://'');

endsWith

1
2
var str = '1.txt';
str.endsWith('.txt');
  1. 字符串模板

let a = 12;
let str = a${a}bc; //str = “a12bc”

字符串连接
  1. 可以直接放入字符串
  2. 可以折行

面向对象

  1. class关键字,构造器和类分开了
  2. class里面直接加方法
  3. 继承
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    //JavaScript
    function User(name, pass){
    this.name = name;
    this.pass = pass;
    }
    User.prototype.showName = function (){
    alert(this.name);
    }
    User.prototype.showPass = function (){
    alert(this.pass);
    }

    function VipUser(name, pass, level){
    User.call(this, name, pass);
    }
    VipUser.prototype = new User();
    VipUser.prototype.constructor = VipUser;
    VipUser.prototype.showLevel = function (){
    alert(this.level);
    }

    var u1 = new VipUser('name', 'pass', 3);
    u1.showName(); //name
    u1.showPass(); //pass
    u1.showLevel(); //3


    //ES6
    class User{
    constructor(name, pass){
    this.name = name;
    this.pass = pass;
    }

    showName(){
    alert(this.name);
    }

    showPass(){
    alert(this.pass)
    }
    }

    class VipUser extends User{
    constructor(name, pass, level){
    super(name, pass);

    this.level = level;
    }

    showLevel(){
    alert(this.level);
    }
    }

    let v1 = new VipUser('name', 'pass', 3);
    v1.showName(); //name
    v1.showPass(); //pass
    v1.showLevel(); //3
面向对象应用 —— React
  1. 组件化 —— class
  2. JSX == babel == browser.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <script type="text/javascript" src="react.js"></script>
    <script type="text/javascript" src="react-dom.js"></script>
    <script type="text/javascript" src="browser.js"></script>
    <script type="text/babel">
    class Item extends React.Component{
    constructor(...args){
    super(...args);
    }

    render(){
    return <li>{this.props.str}</li>;
    }
    }

    class List extends React.Component{
    constructor(...args){
    super(...args);
    }

    render(){
    return <ul>
    {this.props.arr.map(a=><Item str={a}></Item>)}
    </ul>;
    }
    }

    window.onload = function (){
    let oDiv = document.getElementById('div1');

    ReactDOM.render(
    <List arr={['123', '456', '789']}></List>,
    oDiv
    );
    };
    </script>
    <body>
    <div id="div1"></div>
    </body>

JSON

  1. JSON对象
函数 描述
JSON.stringify 用于将 JavaScript 值转换为 JSON 字符串
JOSN.parse 用于将一个 JSON 字符串转换为 JavaScript 对象
  1. 简写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let a = 1;
    let b = 2;
    let json1 = {a, b: 2, c: 3}; //名字(key)和值(value)一样可以只写一个, 如:a == a:a
    let json2 = {
    a:1,
    show: function (){ //: function可以省略
    alert(this.a); //1
    }
    };
json的标准写法
  1. 只能用双引号
  2. 所有的key都必须用引号包起来
    1
    2
    {"a": 1, "b": 2}  
    {"a": "1", "b": "2"}

Promise

异步: 操作之间不相关,同时进行多个操作,代码更复杂
同步: 操作之间相关,不能同时进行多个操作,代码简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//异步
ajax('/banners', function (bannner_data){
ajax('/hotItems', function (hotitem_data){
ajax('/slides', function (slide_data){

}, function (){
alert('读取失败');
});
}, function (){
alert('读取失败');
});
}, function (){
alert('读取失败');
});

//同步
let banner_data = ajax_async('/banners');
let hotitem_data = ajax_async('/hotItems');
let slide_data = ajax_async('/slides');
Promise —— 清除异步操作

用同步一样的方式,来书写异步代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
//方法一
function createPromise(url){
return new Promise(function (resolve, reject){
$.ajax({
url: url,
dataType: 'json',
success(arr){
resolve(arr);
},
err(arr){
reject(arr);
}
})
});
}

Promise.all([
createPromise('arr.txt'),
createPromise('josn.txt')
]).then(function (arr){
let [res1, res2] = arr;

alert('全都成功了');
alert(res1); //[1, 2, 3]
alert(res2); //{"a": 1, "b": 2, "c":3}
}, function (){
alert('至少有一个失败了');
})

//方法二
Promise.all([
$.ajax({url: 'arr.txt', dataType: 'json'}),
$.ajax({url: 'josn.txt', dataType: 'json'})
]).then(function (results){
let [arr, json] = results;

alert('全都成功了');
console.log(arr, json); //[1, 2, 3], {"a": 1, "b": 2, "c":3}
}, function (){
alert('至少有一个失败了');
})
</script>

//arr.txt
[1, 2, 3]

//json.txt
{"a": 1, "b": 2, "c":3}

有了Promise的异步

1
2
3
4
5
Promise.all([$.ajax(), $.ajax()]).then(results=>{
//对了
}, err=>{
//错了
});
Promise.race 竞速
1
2
3
4
5
Promise.race([
$.ajax({url: '服务器1'}),
$.ajax({url: '服务器2'}),
$.ajax({url: '服务器3'})
]);

generator —— 生成器

不能用箭头函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function *show(){
alert('a');
yield;
alert('b');
}
let genObj = show();
genObj.next(); //a
genObj.next(); //b


function 函数(){
代码...
ajax(xxx, function (){ //回调函数
代码...
});
}

function *函数(){
代码...
yield ajax(xxx);
代码...
}
yield

传参
(第一个next没法给yield传参,只能用传统的传参方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function *show(num1, num2){
alert('$(num1), $(num2)');
alert('a');

let a = yield;

alert('b');
alert(a);

return;
}

let gen = show(3, 4);
gen.next(1); //3, 4 a
gen.next(2); //b 2

返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function *show(){
alert('a');

yield 1;

alert('b');

return 2
}

let gen = show();

let res1 = gen.next();
console.log(res1); //a {value: 1, done:false}

let res2 = gen.next();
console.log(res2); //b {value: 2, doen: true}
Promise —— 用于批量读取
generator —— 逻辑性用于逻辑性读取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//回调
$.ajax({url: 'getUserData', dataType: 'json', success(userData){
if (userData.type == 'VIP'){
$.ajax({url: 'getVIPItems', dataType: 'json', success(items){
//生成...
}, error(err){
alert('错了');
}});
} else{
$.ajax({url: 'getItems', dataType: 'json', success(items){
//生成...
}, error(err){
alert('错了');
}});
}
}, error(err){
alert('错了')
}})


//Promise
Promise.all([
$.ajax({url: 'getUserData', dataType:'json'})
]).then(results=>{
let userData = results[0];

if (userData.type == 'VIP'){
Promise.all([
$.ajax({url: 'getVIPItems', dataType: 'json'})
]).then(results=>{
let items = results[0];
//生成...
}, err=>{
alert('错了');
});
} else{
Promise.all([
$.ajax({url: 'getItems', dataType: 'json'})
]).then(results=>{
let items = results[0];
//生成...
}, err=>{
alert('错了');
});
}
});


//generator
runner(function *(){
let userData = yield $.ajax({url: 'getUserData', dataType: 'json'});

if (userData.type == 'VIP'){
let items = yield $ajax({url: 'getVIPItems', dataType "json"});
} else{
let items = yield $ajax({url: 'getItems', dataType "json"});
}
//生成...
})
koa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const koa = require('koa');
const mysql = require('koa-mysql');

let db = mysql.createPool({
host: 'localhost',
user: 'root',
password: '132456'
database: '20180919'
})

server.user(function *(){
let data = yield db.query(`SELECT * FROM user_table`);

this.body = data;
})

server.listen(8080);

ES7预览

数组 includes

数组是否包含某个值

1
2
3
let arr = [1, 2, 3];

alert(arr.includes('1')); //true
数组 keys/values/entries
1
2
for…of //下标(key)
for…in //值(value) 不能用于json
描述
keys 把所有的key拿出来
values 把所有的value拿出来
entries(实体) 把所有的键值对拿出来
1
alert(2**3);    //8
padStart/padEnd
1
2
alert('a'.padStart(5, '0'));  //0000a
alert('a'.padEnd(5, '0')); //a0000
async await
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
async function show(){
alert('a');
await;
alert('b');
}

//函数自带runner
async function readData(){
let data1 = await $.ajax({url: 'data1.txt', dataType: 'json'});
let data2 = await $.ajax({url: 'data2.txt', dataType: 'json'});
let data3 = await $.ajax({url: 'data3.txt', dataType: 'json'});

console.log(data1, data2, data3);
}

//可以使用箭头函数
let readData = async ()=>{
let data1 = await $.ajax({url: 'data1.txt', dataType: 'json'});
let data2 = await $.ajax({url: 'data2.txt', dataType: 'json'});
let data3 = await $.ajax({url: 'data3.txt', dataType: 'json'});

console.log(data1, data2, data3);
}

文章作者: Hyman Choi
文章链接: http://yoursite.com/2018/10/16/ES6基本语法/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 凌晨四点的拖拉机