漫潮者,私有云,NAS,新媒体电商.软件开发,商乾
标题:
你会用ES6,那倒是用啊!!!
[打印本页]
作者:
商乾美工
时间:
2022-4-29 17:32
标题:
你会用ES6,那倒是用啊!!!
(, 下载次数: 1183)
上传
点击文件名下载附件
' a9 E3 l" J! ^, h! O3 S2 `- Z
不是标题党,这是一位leader在一次代码评审会对小组成员发出的“怒吼”,原因是在代码评审中发现很多地方还是采用ES5的写法,也不是说用ES5写法不行,会有BUG,只是造成代码量增多,可读性变差而已。恰好,这位leader有代码洁癖,面对3~5年经验的成员,还写这种水平的代码,极为不满,不断对代码进行吐槽。不过对于他的吐槽,我感觉还是有很大收获的,故就把leader的吐槽记录下来,分享给掘友们,觉得有收获点个赞,有错误的或者更好的写法,非常欢迎在评论中留言。ps:ES5之后的JS语法统称ES6!!!一、关于取值的吐槽取值在程序中非常常见,比如从对象obj中取值。
const obj = {
* j3 w8 Z, ~8 L, e" M
a:1,
* R, ]: `/ G# }
b:2,
# Y5 q* W+ L5 p$ a: z+ E
c:3,
8 S$ D% `6 w, A# @. q% c& \
d:4,
' Q" K' ^* V: Z. V$ @
e:5,
- R4 X \: G$ b& r% X
}
复制代码
, Y; Q0 ~3 f7 p+ i
吐槽:
$ S$ A. O0 N6 c p1 ~
const a = obj.a;
. _2 |1 Q# D. m2 p: F! f1 @+ v$ `
const b = obj.b;
; ]) g- U/ F6 Y! U1 X
const c = obj.c;
/ c* {3 Q1 w G
const d = obj.d;
) b1 i* f& z; D! ^
const e = obj.e;
复制代码
8 S) |3 }& { U. ?# T2 Q3 d% q
% K/ [- T0 U7 X% c$ ^! ^- D
或者
: p+ O6 w! n; q3 ~6 k6 e" u
const f = obj.a + obj.d;
) O. r- X" C8 N% g8 {9 m
const g = obj.c + obj.e;
复制代码
* [( q' Y9 J4 t! C. x+ W
吐槽:“不会用ES6的解构赋值来取值吗?5行代码用1行代码搞定不香吗?直接用对象名加属性名去取值,要是对象名短还好,很长呢?搞得代码中到处都是这个对象名.
; |) ?7 Z8 E- D# S0 f
”改进:
8 D# z# G, Y7 W
const {a,b,c,d,e} = obj;
8 C( C9 y0 o4 m
const f = a + d;
0 M8 ^* M3 g5 n0 h g
const g = c + e;
复制代码
0 f& }. i! j0 C9 h+ v5 e8 W- o
反驳不是不用ES6的解构赋值,而是服务端返回的数据对象中的属性名不是我想要的,这样取值,不是还得重新创建个遍历赋值。吐槽看来你对ES6的解构赋值掌握的还是不够彻底。如果想创建的变量名和对象的属性名不一致,可以这么写:
& W; C6 D8 g) [. Z7 C
const {a:a1} = obj;
% F$ B9 t w+ \! ^) w" z7 t
console.log(a1);// 1补充ES6的解构赋值虽然好用。但是要注意解构的对象不能为undefined、null。否则会报错,故要给被解构的对象一个默认值。
: V# C, @' z" v8 F0 u5 F! W5 e
const {a,b,c,d,e} = obj || {};
复制代码
! E6 [( e. j2 |
二、关于合并数据的吐槽比如合并两个数组,合并两个对象。const a = [1,2,3];
0 C- a/ \0 Z' N3 W, |! }7 [& q
const b = [1,5,6];
& Y3 w0 X; r `5 _1 @' A
const c = a.concat(b);//[1,2,3,1,5,6]
4 J+ O& d1 |! f+ Z8 m
const obj1 = {
& I8 n, [9 {2 O1 _' d! P
a:1,
& x' ^5 D* U5 R$ ~% \1 [
}
( g+ C V/ N# r# H1 r7 F9 v& J, o
const obj2 = {
3 Z# ?* Z! _! q/ G( V+ E
b:1,
8 T5 M$ [2 J- V, o2 C9 J0 n* T2 t& `
}
+ U( T) H- a) X) m% i$ b7 N0 G0 T7 d& d
const obj = Object.assign({}, obj1, obj2);//{a:1,b:1}吐槽ES6的扩展运算符是不是忘记了,还有数组的合并不考虑去重吗?改进const a = [1,2,3];
% C7 s; B6 Y8 t6 c0 i2 f
const b = [1,5,6];
2 L/ w. y% Y9 h3 g/ g+ O
const c = [...new Set([...a,...b])];//[1,2,3,5,6]
/ c0 j3 }) c' r5 H2 t/ q
const obj1 = {
2 X/ Z1 Y" k) k" d
a:1,
0 x. [: h0 T) @& l
}
6 E; V& o7 Y r! A; Q
const obj2 = {
% G9 F- r" y( @$ j- y
b:1,
3 |7 s$ v! D, z3 U3 T+ D
}
- j* b, w# k. K# A2 b( H6 o/ v/ d
const obj = {...obj1,...obj2};//{a:1,b:1}
复制代码
1 [2 ^( J X7 h \. L: L% C
三、关于拼接字符串的吐槽
! H8 _% n0 M& u$ c- |* V
const name = '小明';
) J7 n+ U- w7 V
const score = 59;
\, q2 O, B# h* ]
let result = '';
7 y+ K& e6 V+ e; P G' _4 D
if(score > 60){
4 A& B9 W! b& T& d
result = `${name}的考试成绩及格`;
& Z, f' m0 c1 Z# ~& G, [
}else{
2 o- N( S' m, ]! p+ V
result = `${name}的考试成绩不及格`;
( J2 \; f: w; i( L
}
复制代码
9 F9 ?# c$ }+ U' Q& \8 y
& `7 q% [. @# _5 t% z) j v
吐槽像你们这样用ES6字符串模板,还不如不用,你们根本不清楚在${}中可以做什么操作。在${}中可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性。改进const name = '小明';
# d3 h2 X8 F3 e7 q7 i
const score = 59;
B7 B; [7 I$ L
const result = `${name}${score > 60?'的考试成绩及格':'的考试成绩不及格'}`;
复制代码
2 E7 U* x" i$ m: d# F
四、关于if中判断条件的吐槽if(
& {, e Y. q4 s7 \# a
type == 1 ||
4 E8 K6 u# M% u- x0 d0 J: b* H) k
type == 2 ||
( B7 f( N% m4 n Q% b% h, v1 L- V. d
type == 3 ||
' Y3 t/ q4 M+ V& y4 v
type == 4 ||
. e7 x+ ^( r, X! A& Z3 |( @* f
){
' ]9 b7 K0 {9 o8 \' {' d
//...
. [0 B+ Y: ?# v: Z* G3 X, H1 V
}
复制代码
0 h) h5 K% O7 O1 t5 y
吐槽ES6中数组实例方法includes会不会使用呢?
9 {* h# n4 }0 G3 m' A& I
改进const condition = [1,2,3,4];
% W3 r g' E5 T; c& W3 _" }% o4 G- h! K
if( condition.includes(type) ){
( s" u4 W& M5 u6 n( L$ E* _
//...
0 t# F |! p) {' \. k& a$ i2 i& W, |8 o0 S
}
复制代码
! H; Y# {7 J* }# P( C& R( N% u
五、关于列表搜索的吐槽在项目中,一些没分页的列表的搜索功能由前端来实现,搜索一般分为精确搜索和模糊搜索。搜索也要叫过滤,一般用filter来实现。const a = [1,2,3,4,5];
% G G0 [* x0 T# c; U5 r) v& A
const result = a.filter(
) U( f" L4 A! p w
item =>{
5 N$ k* {( V* I5 V: H* Q
return item === 3
4 p9 t" X7 r$ d6 A& z% @, \: Z
}
4 t3 f7 u' i( D3 W, i; \/ n2 g
)
复制代码
3 R0 x, v% n6 G& w! @) I
吐槽如果是精确搜索不会用ES6中的find吗?性能优化懂么,find方法中找到符合条件的项,就不会继续遍历数组。改进const a = [1,2,3,4,5];
; |; X. R( o, T- e4 b5 i! ?( W) y
const result = a.find(
5 Y9 K- d5 Q% M2 K* d: I
item =>{
7 z! o. }, N1 N3 w6 a3 {1 O& ]
return item === 3
+ T: W9 X/ `; P3 Q7 t( t
}
4 A' i; C' e& {' }& i+ T9 Y" \! B
)
复制代码
9 g( Y/ v4 i2 X- c" u
! t F6 ?7 t% [0 F6 }. H. h1 O8 e7 Z
六、关于扁平化数组的吐槽一个部门JSON数据中,属性名是部门id,属性值是个部门成员id数组集合,现在要把有部门的成员id都提取到一个数组集合中。
0 Z( P' y; \% ?# j
const deps = {
* k d( l# n' R5 E5 B$ H L9 c
'采购部':[1,2,3],
% ?6 i) t- T; W9 P" c
'人事部':[5,8,12],
+ ]+ X2 i/ u9 m6 O+ @2 b! Y
'行政部':[5,14,79],
, c( f `$ a5 d
'运输部':[3,64,105],
; y$ u" Z* e6 v# ?
}
) Q+ m% ?4 |! v6 I% k
let member = [];
2 H; g' V$ t7 P% T8 G: D
for (let item in deps){
! M% B5 }/ W% G8 A
const value = deps[item];
8 S7 V9 z2 s! J1 ?
if(Array.isArray(value)){
$ O5 M7 d8 N4 w" k1 q% N3 w. a! ~
member = [...member,...value]
, b1 G4 Q2 \% L+ X
}
6 p* t8 L) F! O% R6 _2 T6 L
}
( \) X& K" s. W
member = [...new Set(member)]
复制代码
& W5 Z3 E9 j, H2 \( p; z
* D m( l8 x) Z% d3 i' n { y/ {
吐槽获取对象的全部属性值还要遍历吗?Object.values忘记了吗?还有涉及到数组的扁平化处理,为啥不用ES6提供的flat方法呢,还好这次的数组的深度最多只到2维,还要是遇到4维、5维深度的数组,是不是得循环嵌套循环来扁平化?
2 x. Y# ^! c$ N, p+ X* a- j/ w1 O- v
改进
. @0 K* P3 P L
const deps = {
0 @; c# ?& c) }: W# {
'采购部':[1,2,3],
i0 A t! Q& a4 ~& k3 J t
'人事部':[5,8,12],
9 X; _1 I7 l8 E
'行政部':[5,14,79],
4 j1 m3 e# z( P+ y6 e/ B( D8 ~) `
'运输部':[3,64,105],
* h( d& x) Q4 r( F( S
}
$ f% ]9 B- U* Y! T3 P
let member = Object.values(deps).flat(Infinity);
复制代码
3 {" D$ U% G: M
其中使用Infinity作为flat的参数,使得无需知道被扁平化的数组的维度。补充flat方法不支持IE浏览器。七、关于获取对象属性值的吐槽const name = obj && obj.name;吐槽ES6中的可选链操作符会使用么?改进const name = obj?.name;八、关于添加对象属性的吐槽当给对象添加属性时,如果属性名是动态变化的,该怎么处理。let obj = {};
( X( v: S6 l0 J' I
let index = 1;
! C5 B9 c5 P d' H8 c' }
let key = `topic${index}`;
- \6 m2 R/ [' I, s
obj[key] = '话题内容';吐槽为何要额外创建一个变量。不知道ES6中的对象属性名是可以用表达式吗?改进let obj = {};
4 Q' T$ O* J0 J- y, R1 M
let index = 1;
+ [+ d* t$ g8 A7 O5 c. E5 G3 G6 U; Y
obj[`topic${index}`] = '话题内容';
复制代码
; A" u" D2 `' T Z
; ^- |' ~- U2 S
九、关于输入框非空的判断在处理输入框相关业务时,往往会判断输入框未输入值的场景。if(value !== null && value !== undefined && value !== ''){
- D3 Z% W8 V- v& \& {
//...
" }6 t N7 F4 U2 z7 j7 \
}
% L& ]* l, @. V) Q- D' w
吐槽ES6中新出的空值合并运算符了解过吗,要写那么多条件吗?
% L0 C! o, U* g4 S5 Q) S( D* }
if((value??'') !== ''){
0 H9 w2 D0 f4 O5 K# ]! B" U4 E) L
//...
3 I" X% r( t: n' x7 ?
}
& M, }! d, t- E2 `1 R' F; \
十、关于异步函数的吐槽异步函数很常见,经常是用 Promise 来实现。
1 c( y2 N$ c- P
const fn1 = () =>{
1 R0 i* Y& e: g$ U5 [2 f2 n
return new Promise((resolve, reject) => {
7 _, K: g) O0 L. D, u7 |% ?
setTimeout(() => {
+ j) E( h; C2 n8 \7 ]- t' ^
resolve(1);
( W+ {+ }" ~8 a4 R# w
}, 300);
' ?8 ]5 E0 Q# J8 u: |, L: G! D- Y3 P* N
});
0 `, X1 N: i- e. r5 A4 W+ G+ \
}
9 g2 P4 S9 o% v
const fn2 = () =>{
$ N" E/ I9 {& B6 }
return new Promise((resolve, reject) => {
3 c! x, `& U2 y% j7 U& U' l
setTimeout(() => {
8 t h$ a1 t& h. z
resolve(2);
- u5 W1 k- W* o X# f8 O* f3 y$ {8 u
}, 600);
/ J* F3 ~! [6 B/ ]1 p* u4 K
});
3 e+ t7 z; H$ |( A
}
# t6 O3 V; U# M3 y& K9 P0 D
const fn = () =>{
( H! h( I$ f( L* }" O
fn1().then(res1 =>{
, P3 G) L, ^/ H+ D: W! v3 V" e
console.log(res1);// 1
" I2 }+ K3 X0 B0 b' M( D. J! K
fn2().then(res2 =>{
& D. q3 X! w# V# L
console.log(res2)
. J5 R" d" T% g( O9 V& N. f1 r
})
* k* h4 u& _& Q7 F l
})
- r4 H; J' ^( `
}
复制代码
" g/ `0 l r, q* c
吐槽如果这样调用异步函数,不怕形成地狱回调啊!改进
7 t% i! P i, u% g+ s9 g. n
const fn = async () =>{
. a- r( p$ t, u% e# L* L" l+ A+ O
const res1 = await fn1();
1 U5 r1 r4 U, x
const res2 = await fn2();
$ x; A1 q( p0 j$ U) @) W) } }" b
console.log(res1);// 1
e# D$ I3 N1 h
console.log(res2);// 2
+ b& `9 S/ Q- K" {
}
复制代码
. _' f3 _4 @- X
补充但是要做并发请求时,还是要用到
7 Q8 \6 c; P6 Q' }
Promise.all()
, S3 u6 I/ H( T5 ]1 S6 [" b, h
const fn = () =>{
% J: L" x" p4 F" E: R
Promise.all([fn1(),fn2()]).then(res =>{
5 z! _7 U5 |! A3 y) z4 H
console.log(res);// [1,2]
, h' \1 n/ z& U, o5 ^9 Y+ H9 f8 e) a
})
+ c5 q& `; k# \! V4 }6 }
}
复制代码
$ h1 G2 h0 I# `) I5 ]% Z( k. Z/ ^7 s
如果并发请求时,只要其中一个异步函数处理完成,就返回结果,要用到Promise.race()。
4 _/ T% l/ T) W4 k) d+ H
十一、后续欢迎来对以上十点leader的吐槽进行反驳,你的反驳如果有道理的,下次代码评审会上,我替你反驳。此外以上的整理内容有误的地方,欢迎在原文评论中指正,万分感谢。
* o0 R. q$ N1 }; P
/ B* x0 F9 K, g7 T# J
0 N9 L, s0 y4 J/ R/ z0 u
4 ^; n( B$ Y2 v
欢迎光临 漫潮者,私有云,NAS,新媒体电商.软件开发,商乾 (https://www.aurrel.com/)
Powered by Discuz! X3.5