「时光不负,创作不停,本文正在参加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 的值为空值时,使用默认值。
但是当某些业务场景认为,false、0 这样的值也是有效的时候,这里就会出现问题:
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";
其他可以在业务开发中开发更多高效的应用场景。
总结
以上就是个人在最近开发中遇到的一些小的功能点,如有不对的地方,还请大家多多指教。