今日代码整洁小技巧

141 阅读3分钟

「时光不负,创作不停,本文正在参加2021年终总结征文大赛

在开发的过程中,遇到的一些小的开发技巧,做一个记录分享。

1. number 类型与 string 类型的转换

不管是在业务中,还是在开发中,个人认为应该避免数据类型的转换,尤其是在使用了 Typescript 之后。如果是特殊的业务场景那简单的情况下可以使用:

const str = "117";
const num = +str;
console.log(num); // 117

这种情况下容易发生问题:

const foo = "foo";
const num = +foo;
console.log(num); // NaN

同样的当我们需要 number 类型转为 string 的时候:

const num = 117;
const str = 117 + "";
console.log(str); // '117'

注意string 转为 number 的上述书写方式个人认为应该避免出现在提交的代码中。虽然代码很简洁, 但是可读性差而且容易触发 bug,行为不可控。
如果是确定的使用场景,可以使用 parseInt、 或者使用 parseFloat。语义话更强。

2. 数组的去重

这个大家都知道,但是还是提一下,使用 Set 数据结构:

const nums = [1, 1, 3, 5, 6, 7, 8, 8, 8];
const uniqueNums = [...new Set(nums)];
console.log(uniqueNums); // [1,3,5,6,7,8]

同样需要注意的是 Set 的去重更多的是用在基础数据类型,1'1' 并不相等。如果是用在引用 数据类型上,那对比的是引用数据的地址。

3. 判断数字的奇偶性

这个可能(个人推测)大家首先想到的还是数学原理的实现:

function isEven(num: number) {
    return num % 2 === 0;
}

在开发中我们可以利用位运算:

function isEven(num: number) {
    return (num & 1) === 0;
}

这样的代码更适合进行一下封装,而不是直接对某个变量使用 & 操作符,主要是可读性没有那么的清晰。 细心的朋友可能发现了这个函数中的一个坑,那就是在使用了括号将位运算包裹起来了。 这个是因为位运算的优先级低于严格相等操作符,可以点击此处查看所有操作符的优先级。

4. 可选链 ?. 与空值合并运算符 ??

需要注意两者的兼容性。

前端开发中很常见的场景就是需要获取对象中的某一属性 foo.bar 这样的形式,但某些情况下,foo 没有被赋值,那就会导致页面报错:

Uncaught TypeError: Cannot read properties of undefined (reading 'bar')

使用可选链操作符可防止此类情况:

let foo;
let result = foo?.bar;
console.log(result); // undefined

那空值合并运算符是如何使用的呢?看一下这样的业务场景:

let bar = function (foo) {
    return foo || "bar";
};
bar(); // 'bar'
bar("foo"); // 'foo'

这样看起来没有问题,我们利用了 || 逻辑或运算符,当 foo 的值为空值时,使用默认值。 但是当某些业务场景认为,false0 这样的值也是有效的时候,这里就会出现问题:

bar(false); // 'bar'
bar(0); // 'bar'

这个时候就可以使用 ??操作符:

let bar = function (foo) {
    return foo ?? "bar";
};

bar(); // 'bar'
bar("foo"); // 'foo'
bar(false); // false
bar(0); // 0

5. 逻辑与&&和逻辑或||

上面我们提到了逻辑与的一些弊端,这里具体说一下利用逻辑与以及逻辑或的短路原则来使用。

短路原则:知道了前面那个值的结果就知道了最后的结果。
foo && bar:左值为假值时,返回左值,否则返回右值。
foo || bar:左值为假值时,返回右值,否则返回左值。

在开发中合理使用逻辑与以及逻辑或可以使代码更加的清晰:

// 典型场景
// 防止取值出错(可以使用 ?.)
foo && foo.bar;
// 设置默认值
foo || "foo";

其他可以在业务开发中开发更多高效的应用场景。

总结

以上就是个人在最近开发中遇到的一些小的功能点,如有不对的地方,还请大家多多指教。