更优雅的代码写法(细节版)

334 阅读2分钟
  • 健壮性:意外情况下的应对能力
  • 复用性:不重复自己,简洁干净
  • 可扩展性:从容面对需求改变

代码健壮性

意外情况下的应对能力

目的:即使发生了一些错误,但不至于导致整个系统崩溃

  • 提高健壮性的方法:
    • 参数处理
    • 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'