- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章11个Javascript小技巧帮你提升代码质量(小结)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文会不断更新,不足之处欢迎评论区补充.
好处:
代码举例:
实现获取数据,然后操作dom显示数据,最后添加事件 。
函数提炼前 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 逻辑都写在一起,需要将所有逻辑看完才知道这段代码是干嘛的,局部逻辑无法复用
function
main() {
$.ajax.get(
'/getData'
).then((res) => {
const ul = document.getElementById(
'ul'
);
ul.innerHTML = res.list.map(text => `<li class=
"li"
>${text}</li>`).join(
'\n'
);
const list = document.getElementsByClassName(
'li'
);
for
(let i = 0; i < list.length; i ++) {
list[i].addEventListener(
'focus'
, () => {
// do something
});
}
});
}
|
函数提炼后 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
function
getData() {
return
$.ajax.get(
'/getData'
).then((res) => res.data.list);
}
function
showList(list) {
const ul = document.getElementById(
'ul'
);
ul.innerHTML = list.map(text => `<li class=
"li"
>${text}</li>`).join(
'\n'
);
}
function
addEvent() {
const list = document.getElementsByClassName(
'li'
);
for
(let i = 0; i < list.length; i ++) {
list[i].addEventListener(
'focus'
, () => {
// do something
});
}
}
// 逻辑清晰,一眼读懂每一步在做什么,某些提炼出来的函数还可以被复用
async
function
main() {
const list = await getData();
// 获取数据
showList(list);
// 显示页面
addEvent();
// 添加事件
}
|
如果一个函数体内有一些条件分支语句,而这些条件分支语句内部散布了一些重复的代码,那么就有必要进行合并去重工作.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// 合并前
function
main( currPage ){
if
( currPage <= 0 ){
currPage = 0;
jump( currPage );
// 跳转
}
else
if
( currPage >= totalPage ){
currPage = totalPage;
jump( currPage );
// 跳转
}
else
{
jump( currPage );
// 跳转
}
};
// 合并后
function
main( currPage ){
if
( currPage <= 0 ){
currPage = 0;
}
else
if
( currPage >= totalPage ){
currPage = totalPage;
}
jump( currPage );
// 把jump 函数独立出来
};
|
复杂的条件分支语句是导致程序难以阅读和理解的重要原因,而且容易导致一个庞大的函数。有时可以将条件分支语句提炼成语义化的函数,使代码更加直观,逻辑清晰.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// 根据不同季节决定打折力度
function
getPrice( price ){
var
date =
new
Date();
if
( date.getMonth() >= 6 && date.getMonth() <= 9 ){
// 夏天
return
price * 0.8;
}
return
price;
};
// 是否是夏天
function
isSummer(){
var
date =
new
Date();
return
date.getMonth() >= 6 && date.getMonth() <= 9;
};
// 提炼条件后
function
getPrice( price ){
if
( isSummer() ){
return
price * 0.8;
}
return
price;
};
|
如果多段代码实际上负责的是一些重复性的工作,那么可以用循环代替,使代码量更少.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
// 判断是什么浏览器
function
getBrowser(){
const str = navigator.userAgent;
if
(str.includes(
'QQBrowser'
)) {
return
'qq'
;
}
else
if
(str.includes(
'Chrome'
)) {
return
'chrome'
;
}
else
if
(str.includes(
'Safari'
)) {
return
'safri'
;
}
else
if
(str.includes(
'Firefox'
)) {
return
'firefox'
;
}
else
if
(explorer.indexOf(
'Opera'
) >= 0){
return
'opera'
;
}
else
if
(str.includes(
'msie'
)) {
return
'ie'
;
}
else
{
return
'other'
;
}
};
// 循环判断,将对应关系抽象为配置,更加清晰明确
function
getBrowser(){
const str = navigator.userAgent;
const list = [
{key:
'QQBrowser'
, browser:
'qq'
},
{key:
'Chrome'
, browser:
'chrome'
},
{key:
'Safari'
, browser:
'safari'
},
{key:
'Firefox'
, browser:
'firefox'
},
{key:
'Opera'
, browser:
'opera'
},
{key:
'msie'
, browser:
'ie'
},
];
for
(let i = 0; i < list.length; i++) {
const item = list[i];
if
(str.includes(item.key)) {
return
item.browser};
}
return
'other'
;
}
|
让函数变成多出口提前返回,替换嵌套条件分支.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
function
del( obj ){
var
ret;
if
( !obj.isReadOnly ){
// 不为只读的才能被删除
if
( obj.isFolder ){
// 如果是文件夹
ret = deleteFolder( obj );
}
else
if
( obj.isFile ){
// 如果是文件
ret = deleteFile( obj );
}
}
return
ret;
};
function
del( obj ){
if
( obj.isReadOnly ){
// 反转if 表达式
return
;
}
if
( obj.isFolder ){
return
deleteFolder( obj );
}
if
( obj.isFile ){
return
deleteFile( obj );
}
};
|
函数参数过长那么就增加出错的风险,想保证传递的顺序正确就是一件麻烦的事,代码可读性也会变差,尽量保证函数的参数不会太长。如果必须传递多个参数的话,建议使用对象代替.
一般来说,函数参数最好不要超过3个 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
function
setUserInfo( id, name, address, sex, mobile, qq ){
console.log(
'id= '
+ id );
console.log(
'name= '
+name );
console.log(
'address= '
+ address );
console.log(
'sex= '
+ sex );
console.log(
'mobile= '
+ mobile );
console.log(
'qq= '
+ qq );
};
setUserInfo( 1314,
'sven'
,
'shenzhen'
,
'male'
,
'137********'
, 377876679 );
function
setUserInfo( obj ){
console.log(
'id= '
+ obj.id );
console.log(
'name= '
+ obj.name );
console.log(
'address= '
+ obj.address );
console.log(
'sex= '
+ obj.sex );
console.log(
'mobile= '
+ obj.mobile );
console.log(
'qq= '
+ obj.qq );
};
setUserInfo({
id: 1314,
name:
'sven'
,
address:
'shenzhen'
,
sex:
'male'
,
mobile:
'137********'
,
qq: 377876679
});
|
三目运算符性能高,代码量少。 但不应该滥用三目运算符,我们应该在简单逻辑分支使用,在复杂逻辑分支避免使用.
1
2
3
4
5
|
// 简单逻辑可以使用三目运算符
var
global =
typeof
window !==
"undefined"
? window :
this
;
// 复杂逻辑不适合使用
var
ok = isString ? (isTooLang ? 2 : (isTooShort ? 1 : 0)) : -1;
|
优点: 链式调用使用简单,代码量少.
缺点: 链式调用带来的坏处就是在调试不方便,如果我们知道一条链中有错误出现,必须得先把这条链拆开才能加上一些调试 log 或者增加断点,这样才能定位错误出现的地方.
如果该链条的结构相对稳定,后期不易发生修改,可以使用链式.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
var
User = {
id:
null
,
name:
null
,
setId:
function
( id ){
this
.id = id;
return
this
;
},
setName:
function
( name ){
this
.name = name;
return
this
;
}
};
User
.setId( 1314 )
.setName(
'sven'
);
var
user =
new
User();
user.setId( 1314 );
user.setName(
'sven'
);
|
大型类的分解和函数的提炼很像,类太大会出现逻辑不清晰,难以理解和维护的问题。 合理的大类分解可以使类的逻辑清晰,且子模块可以方便复用.
编程语言计算乘除的性能都不高,但是某些情况使用位操作符可以提升乘除等运算的性能.
纯函数是指不依赖于且不改变它作用域之外的变量状态的函数。 纯函数的返回值只由它调用时的参数决定,它的执行不依赖于系统的状态(执行上下文)。 相同的输入参数,一定会得到相同的输出,也就是内部不含有会影响输出的随机变量.
不属于纯函数的特点:
纯函数的作用:
应用场景:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
var
a = 1;
// 非纯函数
function
sum(b) {
return
a + b;
}
// 非纯函数
function
sum(b) {
a = 2;
return
b;
}
// 非纯函数
function
sum(b) {
return
b + Math.random();
}
// 纯函数
function
sum (b, c) {
return
b + c;
}
|
JavaScript设计模式与开发实践 。
到此这篇关于11个Javascript小技巧帮你提升代码质量(小结)的文章就介绍到这了,更多相关Javascript 提升代码质量内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://juejin.cn/post/6909638377247604750 。
最后此篇关于11个Javascript小技巧帮你提升代码质量(小结)的文章就讲到这里了,如果你想了解更多关于11个Javascript小技巧帮你提升代码质量(小结)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
嗨,我是第一次玩 Pig,我很好奇如何处理将一个字段拆分成多个其他字段。 我有一个包,A,如下图: grunt> Dump A; (text, text, Mon Mar 07 12:00:00 CD
如何添加架构中未定义的固定字段(例如日期或月份)?我运行了以下 pig 脚本以将固定日期添加到我的结果表中,并收到以下错误消息:Invalid field projection。方案中不存在投影字段
我是一名优秀的程序员,十分优秀!