JavaScript
2021-12-20 大约 3 分钟
# JavaScript
# 对象api
- object.keys(p)
- object.values(p)
- object.entries(p)
- object.assign(p2,p1,p3)将p1,p3中的属性和值分配给p2
# 数组扩api
- array.map(f)
- array.reduce(f(x,y),default value):把数组中的函数从左到右处理,结果最为下次的参数,x为初始值
- array.find(f)所有元素执行f,返回true者找到
- array.findIndex(f):方法数组元素下标
- array.includes(数组元素)
# 原型
js函数有个prototype属性,默认为{constructor:该函数对象},使用new关键字,会将新的对象的_proto_属性设置成{constructor:该函数对象}
f.prototype = {constructor:f};
a = new f() //a._proto_ = f.prototype
1
2
2
函数的声明会将外部的词法环境的引用赋值给函数的[[enveriment]]属性 每个运行的函数都会自动创建一个词法环境对象 将变量和参数存入环境记录,将[[enveriment]]赋值给外部词法环境的引用
# promise
# 概念
- executor:传递给new Promise的函数,当new Promise被创建,executor会自动运行
- handle:传递给then,catch,finally的函数
- state:promise对象内部属性,最初是 "pending",然后在 resolve 被调用时变为 "fulfilled",或者在 reject 被调用时变为 "rejected"。
- result:promise对象内部属性,最初是 undefined,然后在 resolve(value) 被调用时变为 value,或者在 reject(error) 被调用时变为 error。
- settled:一个resolved或rejected的promise都会被称为“settled”
# 快速使用
let promise = new Promise(function (resolve, reject) {
setTimeout(() => resolve("done!"), 1000);
setTimeout(() => reject(new Error("Whoops!")), 1000);
});
promise
// resolve调用后
.then(result => alert(result))
// reject调用后
.catch(err => alert(err))
// f 总是在 promise 被 settled 时运行:即 promise 被 resolve 或 reject。
.finally(() => alert("haha!"))
// Promise的处理程序都是异步的,所有promise行为都会通过内部的“promise jobs”队列,所以下面的代码先执行
alert("code finished");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 隐式 try…catch
Promise 的执行者(executor)和 promise 的处理程序(handler)周围有一个“隐式的 try..catch”。如果发生异常,它就会被捕获,并被视为 rejection 进行处理。
new Promise((resolve, reject) => {
resolve("ok");
}).then((result) => {
throw new Error("Whoops!"); // reject 这个 promise
}).catch(alert); // Error: Whoops!
1
2
3
4
5
2
3
4
5
# api
- Promise.all:等待所有 promise 都 resolve 时,返回存放它们结果的数组。如果给定的任意一个 promise 为 reject,那么它就会变成 Promise.all 的 error,所有其他 promise 的结果都会被忽略。
- Promise.allSettled: 等待所有 promise 都 settle 时,并以包含以下内容的对象数组的形式返回它们的结果:
- status: "fulfilled" 或 "rejected"
- value(如果 fulfilled)或 reason(如果 rejected)。
- Promise.race:只等待第一个 settled 的 promise 并获取其结果(或 error)
- Promise.any: 等待第一个 fulfilled 的 promise,并将其结果作为结果返回。如果所有 promise 都 rejected,Promise.any 则会抛出 AggregateError 错误类型的 error 实例。
# Async/await
- 在函数前面的 “async” 确保这个函数总是返回一个 promise。其他值将自动被包装在一个 resolved 的 promise 中。
async function f() {
return 1;
}
1
2
3
2
3
- 关键字await让JavaScript引擎等待直到promise完成(settled)并返回结果。这个行为不会耗费任何 CPU 资源,因为 JavaScript 引擎可以同时处理其他任务
- await必须和async一起使用。
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 1000)
});
let result = await promise; // 等待,直到 promise resolve (*)
alert(result); // "done!"
}
f();
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12