- 健壮性:意外情况下的应对能力
- 复用性:不重复自己,简洁干净
- 可扩展性:从容面对需求改变
代码健壮性
意外情况下的应对能力
目的:即使发生了一些错误,但不至于导致整个系统崩溃
- 提高健壮性的方法:
- 参数处理
- try...catch
- 实例化检测
参数处理
原则:不要信任任何传参,都需要做判断
function add(a, b) {
// 判断参数传的不规范情况,可输出错误
if (typeof a !== 'number') {
a = 0
console.warn('add first argument is not a number')
}
if (typeof b !== 'number') {
b = 0
}
return a + b
}
try...catch
原则:不要信任任何用户输入,面对容易出错的代码,需要try...catch包裹,在catch中处理错误,不要中断后面代码执行
try {
fs.readFile('./a.txt')
} catch (err) {
console.log(err)
}
实例化检测
function a() {
if (this instanceof a) {
// 两种调用方式通过instanceof来判断
} else {
// 调用方式错误时代码中
return new a()
}
}
a()
var b = new a()
关于if...else
原则:尽量少出现if...else的嵌套语句
1.单条件
① 简单条件
if (a === b) {
fn1()
}
// 优化写法
(a === b) && fn1()
② 复杂条件
if (a === 'mama' || a === 'papa' || a === 'grand') {
fn1()
}
// 优化写法
let arr = ['mama', 'papa', 'grand']
if (arr.includes(a)) {
fn1()
}
2.双条件(if...else
的简化)
if (a > b) {
fn1()
} else {
fn2()
}
// 优化写法
if (a > b) {
fn1()
return
}
fn2()
// 或者 三元表达式
// 但不要滥用三元表达式,条件太多使用三元含义不清,不建议使用
(a > b) ? fn1() : fn2()
// 三元冗余
v.supplierPictureVOList ? v.supplierPictureVOList : []
// 优化写法
v.supplierPictureVOList || []
3.多条件
① 条件判断,执行函数
if (a > b) {
fn1()
} else if (a < b) {
fn2()
} else {
fn3()
}
// 优化写法
switch...case...
② 条件判断,赋值
let example = ''
if(type == 1) {
example = 'a'
} else if (type == 2) {
example = 'b'
} else if (type == 3) {
example = 'c'
}else{
example = 'd'
}
// 优化写法
let typeObj = {
1: 'a',
2: 'b',
3: 'c',
'default': 'd'
}
let example = typeObj[type] || typeObj.default
关于树结构遍历,减少复杂度map
// da: [
// {
// bspCode: "FINANCE_200"
// bspId: 944
// optionVoList: [{id: 1407, bspId: 944, bspOptionValue: "1", bspOptionLabel: "待付款单据"},…]
// }
// {bspId: 945, bspCode: "SYSTEM_100",…}
// {bspId: 946, bspCode: "FINANCE_201",…}
// ...
// ]
da.forEach(node => {
if (node && node.optionVoList && node.optionVoList.length) {
// 建立所需结构的hashmap
node.hashmap = {}
node.optionVoList.forEach(option => {
node.hashmap[option.bspOptionValue] = option.bspOptionLabel
})
}
this.charValueDataHashMap[node.bspCode] = node.hashmap
})
// this.charValueDataHashMap: {
// FINANCE_200: {1: "待付款单据", 2: "待付款明细", 3: "本次付款金额"}
// FINANCE_201: {1: "按‘生效日期’升序匹配", 2: "按未开发票金额升序匹配"}
// FINANCE_202: {1: "按‘生效日期’升序匹配", 2: "按未付款金额升序匹配"}
//}
d.forEach(item => {
if (item[paramsKeys.bspType] === '字符型') {
item[paramsKeys.bspCharValue] = this.charValueDataHashMap[item[paramsKeys.bspCode]][item[paramsKeys.bspCharValue]]
item[paramsKeys.bspGroupCharValue] = this.charValueDataHashMap[item[paramsKeys.bspCode]][item[paramsKeys.bspGroupCharValue]]
}
})
优雅取整
var a = ~~2.33 // 2
var b= 2.33 | 0 // 2
var c= 2.33 >> 0 // 2
类型转换
转数字
// 字符串转数字
let str = '1234'
let num = +str
// 日期转时间戳
console.log(+new Date()) // 1536231682006
// boolean转数字
let m = +true // 1
let n = +false // 0
转字符串
let a = 1
`${a}` // '1'
a + '' // '1'