1、变量
let 不能重复声明,变量——可以修改,块级作用域
const 不能重复声明,常量——不能修改,块级作用域
2、箭头函数
通常写法:
function func(para1, para2) {
// do something...
}
箭头函数:
(para1, para2) => {
// do something...
}
简化:
(1)、如果只有一个参数,可以省略括号()
(2)、如果{}内只有一个语句,且是return语句,可以省略大括号{}
eg:para1 => return para1 * 2
3、函数参数
参数扩展/展开
(1)、收集参数
function(para1, para2, ...paras){}
*Rest Parameter必须是最后一个,paras只是一个名称,可以随意起
(2)、展开数组
*展开后的效果,跟把数组的内容写在这里一样
eg:let arr = [1,2,3];
let arrs = [...arr, ...arr]; == let arrs = [1,2,3,1,2,3];
(3)、默认参数,默认参数后面的也必须是默认参数
function(para1, para2=5) {}
4、解构赋值
(1)、左右两边结构必须一样
(2)、右边必须是正确的存在的结构,例如数组、json等等
(3)、声明和赋值不能分开,必须在一句话里完成
eg:let [a,b,c] = [12,5,8];
let {a,b,c} = {a: 12, b: 5, c: 8};
let [json, arr, str, num] = [{a:12, b:5}, [1, 2], 'str', 1];
let [{a, b}, [c, d], e, f] = [{a:12, b:5}, [1, 2], 'str', 1];
5、数组方法
(1)、map:映射,进入时什么回来的是什么
eg:let arr = [1,2,3];
// 这里item是每一个项
let result = arr.map(item => item * 2); // [2,4,6]
(2)、reduce:汇总,进去多个出来一个
eg:let arr = [1,2,3];
// beforeResult:每一次return的值,默认第一次是第一个参数,这里就是1,
// currentItem:每一个项,从第二个位置开始
// index:当前项的索引
// 计算平均值
let avrg = arr.reduce(function(beforeResult, currentItem, index) {
if (index == arr.length - 1) {
return (beforeResult + currentItem) / arr.length;
} else {
return beforeResult + currentItem;
}
});
// 2
(3)、filter:过滤,符合条件的返回
eg:let arr = [1,2,3,4,5];
let result = arr.filter(item => item % 2 == 0); // [2,4]
(4)、forEach:遍历
6、字符串
(1)、两个新方法:startWith,endWith
(2)、字符串模板、字符串连接、反单引号:
eg:let content = '内容';
let str = `<div>{content}</div>`;
// 可以折行
let str = `<div>
<h1>{content}</h1>
</div>`;
7、面向对象:
(1)、class关键字
(2)、constructor构造器初始化参数
对比:
旧写法:
function User(name, password) {
this.name = name;
this.password = password;
}
// 原型链上的属性和方法
User.prototype.eat = '吃东西';
User.prototype.showName = function() {
alert(this.name);
}
User.prototype.showPassword = function() {
alert(this.password);
}
// 静态属性和方法
User.say = '说话';
User.sayHello = function() {
alert('你好');
};
// 使用静态属性和方法
console.log(User.say);
console.log(User.sayHello));
var user = new User('blue', '123456');
user.showName();
user.showPassword();
// 继承
function VipUser(name, password, level) {
User.call(this, name, password); // 对象冒充实现继承:如果只写这个,则不会继承原型链上的属性和方法
this.level = level;
}
VipUser.prototype = new User(); // 原型链继承:如果只写这个,则不能给父元素传值,比如访问不到name和password
VipUser.prototype.constructor = VipUser;
VipUser.prototype.showLevel = function () {
alert(this.level);
}
var vipUser = new VipUser('red', '987654', '3');
vipUser.showName();
vipUser.showPassword();
vipUser.showLevel();
es6写法:
class User {
constructor(name, password) {
this.name = name;
this.password = password;
}
showName() {
alert(this.name);
}
showPassword() {
alert(this.password);
}
// 静态属性和方法
static sayHello() {
alert('你好');
}
}
// 也可以是旧的写法
User.say = '说话';
User.sayHello = function() {
alert('你好');
};
console.log(User.say);
User.sayHello();
let user = new User('blue', '123456');
user.showName();
user.showPassword();
// 继承
class VipUser extends User {
constructor(name, password, level) {
super(name, password);
this.level = level;
}
showLevel() {
alert(this.level);
}
}
let vipUser = new VipUser('red', '987654', '3');
vipUser.showName();
vipUser.showPassword();
vipUser.showLevel();
单例:在实例化多个对象的时候,只执行一次构造方法,而不用每实例化一个对象的时候就重复的去执行构造方法,实际上是利用了静态方法来实现的。
/*
class Db {
constructor () {
console.log('实例化的时候执行一次');
}
find() {
console.log('数据库查询');
}
update() {
console.log('数据库修改');
}
}
var db1 = new Db();
// 实例化的时候执行一次
var db2 = new Db();
// 实例化的时候执行一次*/
class Db {
// 通过判断Db是否有instance,来判断当前的Db是否已经实例化过了,如果实例化过了就直接返回该实例,这样就实现了单例
static getInstance() {
if (!Db.instance) {
Db.instance = new Db();
}
return Db.instance;
}
constructor () {
console.log('实例化的时候执行一次');
}
find() {
console.log('数据库查询');
}
update() {
console.log('数据库修改');
}
}
// 调用
var db1 = Db.getInstance();
// 实例化的时候执行一次
var db2 = Db.getInstance();
var db3 = Db.getInstance();
var db4 = Db.getInstance();
db3.find();
// 数据库查询
db4.find();
// 数据库查询
8、JSON对象
简写:名字一样、方法简写
json的标准写法:
(1)、只能用双引号
(2)、所有的名字都必须用引用包起来
eg:{"a": 1} √
{"a": '1'} ×
json简写:
名字和值一样的时候可以只写一个
eg:let a = 1
let b = 2
let json = {a: a, b: b}
=>
let json = {a, b}
let json = {
a: a,
show: function() {
alert(1)
}
}
=>
let json = {
a,
show(){
alert(1)
}
}
9、Promise——承诺(例子见11)
异步:操作之间没啥关系,同时进行多个操作、代码更复杂
同步:同时只能做一件事、代码简单
/*var p = new Promise( (resolve, reject) => {
setTimeout(() => {
var name = '张三';
if (Math.random() < 0.7) {
resolve(name);
} else {
reject('失败');
}
});
} );*/
var getName = function(resolve, reject) {
setTimeout(() => {
var name = '张三';
if (Math.random() < 0.7) {
resolve(name);
} else {
reject('失败');
}
});
};
var p = new Promise(getName);
p.then( (data) => {
console.log(data)
} );
Promise——消除异步操作
*用同步一样的方式,来书写异步代码
10、generator——生成器(例子见11)
普通函数——一路走到底
生成器——中间能停
11、异步的Jquery写法、Promise写法、generator写法对比:
1、不带逻辑实现
普通ajax:
$.ajax({
url: xx,
dataType: 'json',
success() {
},
error() {
alert('失败了')
}
});
Promise:
// 这里$.ajax({url: xxx, dataType: 'json'})返回的就是一个Promise对象
Promise.all([
$.ajax({url: xxx, dataType: 'json'}),
$.ajax({url: yyy, dataType: 'json'})
]).then(results=>{
alert('都成功了')
}, err=> {
alert('至少一个失败了')
})
generator:
// yield后面的值将作为它的返回值,返回给它前面的变量,去进行下一个动作的实现。
// 1、这里就是先执行$.ajax({url: xxx, dataType: 'json'}),这里做完之后,返回一个Promise对象给yield
// 2、前面返回的Promise对象,赋值给data1,作为然后处理完逻辑之后,可以作为$.ajax({url: yyy, dataType: 'json'})的
// 参数或者其他逻辑判断
runner(function *(){
let data1 = yield $.ajax({url: xxx, dataType: 'json'})
let data2 = yield $.ajax({url: yyy, dataType: 'json'})
});
(runner需要下载 yield-runner-blue)
2、带逻辑
普通ajax:
$.ajax({
url: xx,
dataType: 'json',
success(results) {
if (result.type == 'XXX') {
$.ajax({
url: xx2,
dataType: 'json',
success() {
},
error() {
alert('失败了')
}
});
} else {
$.ajax({
url: xx3,
dataType: 'json',
success() {
},
error() {
alert('失败了')
}
});
}
},
error() {
alert('失败了')
}
});
Promise(这里会和jquery感觉上没有相差多少):
Promise.all([
$.ajax({url: xxx, dataType: 'json'})
]).then(results=>{
if (results[0].type == 'XXX') {
Promise.all([
$.ajax({url: xx2, dataType: 'json'})
]).then(results=>{
}, err=> {
alert('至少一个失败了')
})
} else {
Promise.all([
$.ajax({url: xx3, dataType: 'json'})
]).then(results=>{
alert('都成功了')
}, err=> {
alert('至少一个失败了')
})
}
}, err=> {
alert('至少一个失败了')
})
generator(异步的同步写法):
runner(function *(){
let data1 = yield $.ajax({url: xxx, dataType: 'json'})
if (data1.type == 'XXX') {
let data2 = yield $.ajax({url: xx2, dataType: 'json'})
} else {
let data2 = yield $.ajax({url: xx3, dataType: 'json'})
}
});
12、async和await
(1)、async:可以将同步方法变成异步方法
async function getData() {
return '这是一个 getDataasync异步方法';
}
console.log(getData()); // Promise { '这是一个 getDataasync异步方法' }
(2)、await:等待异步方法执行完成,但必须在异步方法里面使用,因为await本身会阻塞程序。
/*async function getData() {
return '这是一个 getDataasync异步方法';
}
async function getD() {
let d = await getData();
console.log(d);
}
getD();*/
function getData() {
return new Promise( (resolve, reject) => {
resolve('这是一个 getDataasync异步方法');
} );
}
async function getD() {
let d = await getData();
console.log(d);
}
getD();