Skip to content

Commit ce3f2a3

Browse files
author
zhangdong
committed
手写题
1 parent 4afb833 commit ce3f2a3

File tree

3 files changed

+222
-83
lines changed

3 files changed

+222
-83
lines changed

.vitepress/config.mts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ export default defineConfig({
196196
text: "调试",
197197
link: "/javascript/grammar/devtool",
198198
},
199+
{
200+
text: "总结",
201+
link: "/javascript/grammar/summary.md",
202+
},
199203
],
200204
},
201205
],
@@ -299,6 +303,7 @@ export default defineConfig({
299303
{ text: "难点", link: "/configure/difficult" },
300304
{ text: "要点", link: "/configure/bagu" },
301305
{ text: "工程化", link: "/configure/engine" },
306+
{ text: "性能优化", link: "/configure/opt" },
302307
],
303308
},
304309
],

javascript/handlecode.md

Lines changed: 217 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -2,96 +2,81 @@
22
outline: deep
33
---
44

5-
### 实现promise.all/allSettled
6-
* 接收一个可迭代对象
7-
* 传入的数据中可以是普通数据,也可以是Promise对象
8-
* 可迭代对象的promise是并行执行的
9-
* 保持输入数组的顺序和输出数组的顺序一致
10-
* 传入数组中只要有一个reject,立即返回reject
11-
* 所有数据resolve之后返回结果
5+
### 实现 promise.all/allSettled
6+
7+
- 接收一个可迭代对象
8+
- 传入的数据中可以是普通数据,也可以是 Promise 对象
9+
- 可迭代对象的 promise 是并行执行的
10+
- 保持输入数组的顺序和输出数组的顺序一致
11+
- 传入数组中只要有一个 reject,立即返回 reject
12+
- 所有数据 resolve 之后返回结果
1213

1314
```js
14-
function myPromiseAll(promises){
15-
return new Promise((resolve,reject)=>{
16-
if(!Boolean(promises[Symbol.iterator])){
17-
return reject(new TypeError (`${typeof promises} is not iterable(cannot read property Symbol(Symbol.iterator)`))
18-
}
19-
let res = []
20-
let completed = 0
21-
if(promises.length===0){
22-
return resolve(res)//return ,后面不需要执行
15+
function myPromiseAll(promises) {
16+
return new Promise((resolve, reject) => {
17+
// 1. 参数校验
18+
if (typeof promises?.[Symbol.iterator] !== "function") {
19+
return reject(new TypeError(`${typeof promises} is not iterable`));
2320
}
24-
promises.forEach((item,index)=>{
25-
Promise.reslove(item).then(value=>{
26-
res[index] = value
27-
completed++
28-
if(completed===promises.length){
29-
resolve(res)
30-
}
31-
}).catch(err=>{
32-
reject(err)
33-
})
34-
})
35-
})
36-
}
37-
```
3821

22+
// 2. 转换为确定长度的数组
23+
const promiseArr = Array.from(promises);
24+
const total = promiseArr.length;
25+
const res = [];
26+
let completed = 0;
3927

40-
```js
41-
function myPromiseAllSettled(promises){
42-
return new Promise((resolve,reject)=>{
43-
if(!Boolean(promises[Symbol.iterator])){
44-
return reject(new TypeError(`${typeof promises} is not iterable(cannot read property Symbol(Symbol.iterator)`))
45-
}
46-
let res = []
47-
let completed = 0
48-
if(promises.length===0){
49-
return resolve(res)
50-
}
51-
promises.forEach((item,index)=>{
52-
promise.resolve(item).then(value=>{
53-
res[index]={status:'fulfilled',value}
54-
}).catch(reson=>{
55-
res[index]={status:'rejected',reason}
56-
}).finally(()=>{
57-
completed++
58-
if(completed===promises.length){
59-
resolve(res)
28+
// 3. 处理空迭代器
29+
if (total === 0) return resolve(res);
30+
31+
// 4. 遍历处理
32+
for (let i = 0; i < total; i++) {
33+
const p = promiseArr[i];
34+
Promise.resolve(p)
35+
.then((value) => {
36+
res[i] = value;
37+
completed++;
38+
if (completed === total) {
39+
resolve(res);
6040
}
6141
})
62-
})
63-
})
42+
.catch((err) => {
43+
reject(err);
44+
});
45+
}
46+
});
6447
}
6548
```
6649
6750
```js
68-
function myPromiseAll(promises){
69-
return new Promise((resolve,reject)=>{
70-
if(!Boolean(promises[Symbol.iterator])){
71-
throw(new TypeError(`${typeof promises} is not iterator`))
72-
}
73-
let res = []
74-
let count = 0
75-
let total = promises.length
76-
if(total===0){
77-
resove([])
78-
return
79-
}
80-
for(let i=0;i<total;i++){
81-
promise.resolve(promise).then((val)=>{
82-
res[i]=val
83-
count++
84-
if(count===total){
85-
resolve(res)
86-
}
87-
}).catch((err)=>{
88-
reject(err)
51+
function myPromiseAllSettle(promises){
52+
return new Promise((resolve,reject)=>{
53+
if(typeof promises[Symbol.iterator]!=='function'){
54+
return reject(new TypeError(`${typeof promises} is not iterable`))
55+
}
56+
let res = []
57+
let complete = 0
58+
let pArr = Array.from(promises)
59+
let total = pArr.length
60+
if(total===0){
61+
return resolve(res)
62+
}
63+
pArr.forEach((item,i)=>{
64+
Promise.resolve(item).then((value)=>{
65+
res[i] = {status:'fulfilled',value}
66+
}).catch(reason=>{
67+
res[i] = {status:'rejected',reason}
68+
}).finally(()=>{
69+
complete++
70+
if(complete===total){
71+
resolve(res)
72+
}
8973
})
90-
}
91-
})
74+
})
75+
})
9276
}
9377
```
9478
### 防抖和节流
79+
9580
```js
9681
function debounce(fn, delay) {
9782
let timer;
@@ -103,16 +88,165 @@ function debounce(fn, delay) {
10388
};
10489
}
10590

106-
function throttle(fn,delay){
107-
let lastTime = 0
108-
return function(...args){
109-
const now = Date.now()
110-
if(now - lastTime >= delay){
111-
fn.apply(this,args)
112-
lastTime = now
91+
function throttle(fn, delay) {
92+
let lastTime = 0;
93+
return function (...args) {
94+
const now = Date.now();
95+
if (now - lastTime >= delay) {
96+
fn.apply(this, args);
97+
lastTime = now;
98+
}
99+
};
100+
}
101+
```
102+
103+
### 深拷贝,数组打平
104+
这类题都是一样的,要用递归
105+
106+
但是跟力扣里二叉树相关的还不太一样,因为二叉树没有数组这个结构,所以在dfs里要判断一下传入节点的类型是数组还是对象
107+
108+
一般是数组需要循环处理
109+
```js
110+
// 输入: cityData、 'kklio2'
111+
// 输出: '广东省-东莞市-B区'
112+
const cityData = [
113+
{
114+
id: "axzx",
115+
name: "广东省",
116+
children: [
117+
{
118+
id: "sdsd",
119+
name: "深圳市",
120+
children: [
121+
{
122+
id: "45dss",
123+
name: "南山区",
124+
},
125+
{
126+
id: "sdsd11",
127+
name: "福田区",
128+
children: [
129+
{
130+
id: "ddrr2",
131+
name: "A街道",
132+
},
133+
],
134+
},
135+
],
136+
},
137+
{
138+
id: "2323d",
139+
name: "东莞市",
140+
children: [
141+
{
142+
id: "xxs2",
143+
name: "A区",
144+
},
145+
{
146+
id: "kklio2",
147+
name: "B区",
148+
},
149+
],
150+
},
151+
],
152+
},
153+
];
154+
function search(cityData, key) {
155+
let path = [];
156+
let res = [];
157+
function dfs(node) {
158+
if (!node) {
159+
return;
160+
}
161+
if (Array.isArray(node)) {
162+
for (let i = 0; i < node.length; i++) {
163+
dfs(node[i]);
164+
}
165+
} else {
166+
path.push(node.name);
167+
if (node.id === key) {
168+
res = [...path];
169+
return;
170+
} else {
171+
dfs(node.children);
172+
}
173+
path.pop();
113174
}
114175
}
176+
dfs(cityData);
177+
return res;
115178
}
179+
console.log(search(cityData, "45dss"));
180+
```
181+
### Proxy
182+
get要return值,set return false会报错
183+
// 实现 handler 函数以达到以下输出效果:
184+
185+
```js
186+
const proxy = new Proxy({}, handler);
187+
proxy.a = 10;
188+
console.log(proxy.a); // 输出 10
189+
console.log(proxy.b); // 输出 'default'
190+
proxy.a = 'string';
191+
console.log(proxy.a); // 输出 10
192+
```
193+
194+
```js
195+
const handler = {
196+
get(target, prop) {
197+
if(prop==='a'){
198+
return target[prop]
199+
}else{
200+
return 'default'
201+
}
202+
},
203+
set(target, prop, value) {
204+
if (prop === "a") {
205+
if (typeof value === "number") {
206+
target[prop] = value;
207+
}
208+
} else {
209+
target[prop] = value;
210+
}
211+
return true; // 必须返回 true 表示操作成功
212+
},
213+
};
116214
```
215+
### js大数相加
216+
转成字符串在reverse处理
117217
118-
### 深拷贝,数组打平
218+
```js
219+
// js实现大数相加
220+
function sum(a, b) {
221+
a += ''
222+
b += ''
223+
let arr1 = a
224+
.split('')
225+
.reverse()
226+
.map((item) => +item)
227+
let arr2 = b
228+
.split('')
229+
.reverse()
230+
.map((item) => +item)
231+
let add = 0
232+
let res = []
233+
let max = Math.max(arr1.length, arr2.length)
234+
for (let i = 0; i < max; i++) {
235+
let num1 = arr1[i] || 0
236+
let num2 = arr2[i] || 0
237+
res.push((num1 + num2 + add) % 10)
238+
if (num1 + num2 + add >= 10) {
239+
add = 1
240+
} else {
241+
add = 0
242+
}
243+
console.log(num1 + num2 + add)
244+
}
245+
if (add) {
246+
res.push(1)
247+
}
248+
return res.reverse().join('')
249+
}
250+
```
251+
### 构建html的ast
252+
![alt text](image.png)

javascript/image.png

44.1 KB
Loading

0 commit comments

Comments
 (0)