我在日常coding中,有时候会遇到一些让我眼前一亮的代码,在此小记。

减少条件嵌套

此节暂不考虑三元表达式。

if...else...在代码中使用的频率非常高,每写一次if...else...就增加了一层代码嵌套,如果存在多层嵌套,会让代码看起来非常不整洁,也不便于理解。

其实在条件允许情况下,我们可以使用一个小技巧来减少嵌套的层级数。

比如原始代码是这样的:

function setName(value) {
    if (value) {
        this.name = value;
    } else {
        this.name = 'Bob';
        this.hasInput = false;
    }
}

上述代码是可以简化的,使用return截断函数,可以省去else的嵌套如下:

function setName(value) {
    if (value) {
        this.name = value;
        return;
    }
    this.name = 'Bob';
    this.hasInput = false;
}

当然,这样的写法是有条件的,那就是else后面没有其他代码。如果原始代码是下面这样,那就无法使用这个小技巧:

function setName(value) {
    if (value) {
        this.name = value;
    } else {
        this.name = 'Bob';
        this.hasInput = false;
    }
    this.lastName = 'Mr.' + this.name;
}

参考:代码重构实践

短路原则

如果存着这样的场景,当某个变量为true的时候,展示<div>,否则就不展示。

可能我们会这样写:

<div>
    {
        hasChild
            ?
            <div>……</div>
            :
            null
    }
</div>

这样写也能实现,但是还有更简洁的写法,那就是运用短路原则:

<div>
    {
        hasChild && (
            <div>……</div>
        )
    }
</div>

这样写是不是要简洁多了~~😚

连续柯里化

官方释义:

把接受多个参数的函数变换成接受一个单一参数的函数,并且返回(接受余下的参数而且返回结果的)新函数的技术

比如,我们需要完成如下功能:

add(1)(2)(3);   // 6

比较麻烦点的方法是不断地嵌套函数:

const add = function(x) {
    return function(y) {
        return function(z) {
            return x + y + z;
        };
    };
};

虽然这样写也能实现效果,但总是麻烦了些。可以利用箭头函数完成代码优化:

const add = x => y => z => x + y + z;

这样是不是代码量大幅度减少了呢。嗯,ES6真香!

干掉你的switch

switch case是应用非常广的语句,但是有时候我们能有更好的替换方法。

原代码:

let res = '';
switch(type) {
    case 'waiting':
        res = 'haha';
        break;
    case 'success':
        res = 'heihei';
        break;
    case 'fail':
        res = function() {
            return 'NO!';
        };
        break;
    default:
}

其实上面的代码可以换一种写法:

const obj = {
    waiting: 'haha',
    success: 'heihei',
    fail: function() {
        return 'NO!'
    },
};
const res = obj[type];

实现了同样的效果,但是代码量却少了不少哦。是不是很妙啊,我第一次看到这样的写法是在antd的源码中,自从看到了这美妙的代码,我几乎就没怎么写过switch case了。