modul模块
导出:
function format(date) {return date.toLocaleString();};export default format;
export function reverse(str){}
export const PRISE = 500;
export {name,say}
导入:
<script type="module">
import format from ‘相对路径’(format可以和导出的时候不一致)
import {reverse} from ‘相对路径’(reverse要和源文件方法一致)
import * as utils from '相对路径';
utils.say();
utils.reverse("我喜欢你")
utils.default(new Date())
</script>
导入别名
import {reverse as r} from ‘相对路径’
默认和普通方法是一个文件
import format, { reverse as c, PRISE ,name ,say } from '相对路径';
ES6新增数据类型
-
set:集合(不重复的数组) set对应的方法: add:添加 delete:删除 clear:清空 size:大小 -
map:图(键名可以是任何类型的对象) map对应的方法: set(key,value):设置 get(key):获取 delete:删除 clear:清空 size:大小 has:检测 […newSet(arr)]:去重 -
symbol:符号(唯一的符号) -
weekSet:值是引用类型 -
weekMap:值是引用类型
ES6新增类
由于type of class:检测的结果是function,所以类的本质是函数
- 语法:class Block{ }
- 构造函数:constructor(){}
- 实例化的时候 new 关键字调用的就是构造函数
- super():调用父类的构造函数
- extends:继承父类的方法
- static:类的静态属性和方法
- 类的this指向的是它的实例(也就是new出来的对象)
ES6的迭代类型
可以for of遍历的对象都是可迭代对象
如:String字符串、Array数组、Set集合、Map图
for(let v of myset)
for(let k of myArr.keys())
for(let v of myArr.values())
for(let [k,v] of myArr.entriess())
Promise
var p = new Promise((resolve, reject) => {
var n = Math.random();
setTimeout(() => {
if (n > 0.5) {
resolve('买');
} else {
reject('不买')
}
}, 2000)
})
console.log(p);
p.then(res => {
console.log(res);
}, err => console.error(err))
三个状态:pendding、resolved、rejected,状态的变化不可逆
all(全部)
function downImg(url) {
return new Promise((resolve, reject) => {
var img = document.createElement("img");
img.src = url;
img.onload = function () {
resolve(img);
}
img.onerror = function (err) {
reject(err);
}
})
}
var urls = [
"https://img.alicdn.com/imgextra/i4/6000000006083/O1CN01tdjfJP1uo430zVbdp_!!6000000006083-2-octopus.png",
"https://img.alicdn.com/imgextra/i1/6000000001569/O1CN0108sLbY1NSeCvAJtPL_!!6000000001569-0-octopus.jpg",
"https://img.alicdn.com/imgextra/i3/6000000002368/O1CN01lbQxeC1TMafHbjdvd_!!6000000002368-0-octopus.jpg"
];
Promise.all(urls.map(item => downImg(item)))
.then(res => {
console.log(res);
for (var k of res) {
document.body.appendChild(k);
}
})
.catch(err => {
console.error(err);
})
race(返回最先resolve的结果)
function downImg(url) {
return new Promise((resolve, reject) => {
var img = document.createElement("img");
img.src = url;
img.onload = function () {
resolve(img);
}
img.onerror = function (err) {
reject(err);
}
})
}
var urls = [
"https://img.alicdn.com/imgextra/i4/6000000006083/O1CN01tdjfJP1uo430zVbdp_!!6000000006083-2-octopus.png",
"https://img.alicdn.com/imgextra/i1/6000000001569/O1CN0108sLbY1NSeCvAJtPL_!!6000000001569-0-octopus.jpg",
"https://img.alicdn.com/imgextra/i3/6000000002368/O1CN01lbQxeC1TMafHbjdvd_!!6000000002368-0-octopus.jpg"
];
Promise.race(urls.map(item => downImg(item)))
.then(res => {
document.body.appendChild(res);
})
.catch(err => {
console.error(err);
})
实例P
.then(res=>{})
.catch(err=>{})
异步和同步
异步
异步是先执行主线程的代码,再执行其它线程(非阻塞式)
实现异步的方式
- 回调函数
- 事件响应
- 订阅发布模式
- Promise
- sync和await
同步
同步是按顺序从上至下阻塞式执行代码(上一行代码不执行完毕,下行是不会执行)
async与await
async
async装饰的函数,返回的是一个promise对象,返回的结果是resolved的结果
await
await用来等待异步中的resolve结果,只能出现在async装饰的函数中
async function doit(){
var m1 = await say("你笑起来真好看",2000);
var m2 = await say("像春天的花一样",3000);
return m1 + m2;
}
doit()
.then(res => {})
.catch(err => {})
function say(msg, delay) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(msg), delay);
})
}
async function doit() {
var m1 = await say("国庆快乐!", 2000);
console.log(m1);
var m2 = await say("祝祖国越来越繁荣昌盛", 3000);
console.log(m2);
return "举国欢庆!";
}
doit()
.then(res => console.log(res))
generator生成器
就是在函数前面加个*
function *range(min,max){
for(var i = min; i < max; i++){
yield;
}
}
var iter = range(1,10)
{value:1,done:false}
...
{value:undefined,done:false}
可以通过for来遍历迭代器
可以是String,Array,Set,Map的迭代器
for(var v of fange (1,100){
console.log(v);
})
arr[Symbol.iterator]()
Object.defineProperty
Object.defineProperty(obj,props,{
set(v){
},
get(){
},
configurable : true,
enumberable : true,
value,
writable : true,
...
})
var obj = { _age: 18 };
Object.defineProperty(obj, "age", {
get() {
return this._age;
},
set() {
if (v > 200 || v < 1 || isNaN(v)) {
throw "年龄设置错误"
} else {
this._age = v;
}
}
})
proxy代理对象
var obj = {
price: 100
}
var handle = {
get(target, property) {
console.log(new Date().toLocaleString(), "又在看钱包了");
},
set(target, property, value) {
target[property] = value;
console.log(("我的钱包变成了" + value));
}
}
var proxy = new Proxy(obj, handle)
|