成为现代 JavaScript 大师的 3 个小技巧
☝点击上方蓝字关注我们,过早的优化是罪恶之源。🧑💻
序
通常在 Angular 或 React 项目中,code review 时看到一些老式的 JavaScript 代码,就会将开发人员归类为初学者。但是,如果你知道以下 3 个技巧,你将被视为现代 JavaScript 的尤达大师。那么,让我们开始我们的旅程吧!
▽ 正文
一、神奇的扩展运算符
扩展运算符(spread)是三个点(...
), 可以说我在 JavaScript
中最喜欢的运算符了。我主要在以下 3 种情况下使用:
拷贝数组
const arr = [1, 2, 3, 4]
const newArr = [...arr]
console.log(newArr) // [1, 2, 3, 4]
合并数组
const numArr = [1, 2, 3, 4]
const alphaArr = ['a', 'b', 'c']
const newArr = [...numArr, ...alphaArr]
console.log(newArr) // [1, 2, 3, 4, 'a', 'b', 'c']
展开对象
const rectangle = { width: 10, height: 10 }
const cube = { ...rectangle, length: 7 }
console.log(cube) // {width: 10, height: 10, length: 7}
二、空检查的最佳方法
你还记得你写的第一个空检查代码吗?当 JavaScript 还没有现在这个完善时,我曾在我的旧代码中这样写:
if (foo !== null && foo !== undefined) { }
后来,我的生命被简单的 if
拯救!
if (foo) {}
只要条件值 foo 不是下列值,都将为真值
null undefined NaN 空字符串 ("") 0 false
除了简单的 if 之外,现代 JavaScript 的可选链操作符?.
与空值合并运算符??
可以使我们的代码更加简洁
可选链操作符
可选链操作符是访问嵌套对象属性的安全方式。这意味着在访问一长串对象属性时,我们不必进行多次空检查。当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明
以下示例检查客户地址的邮政编码是否为 null :
const client = {
name: 'Liu Xing',
address: {
zipcode: '1234'
}
}
// 老的取值方式
if (client && client.address && client.address.zipcode) {}
// 更加现代的可选链操作符方式
if (client?.address?.zipcode) {}
空值合并运算符
空值合并操作符(??
)是一个逻辑操作符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。
const defaultMessage = 'Hello JavaScript 之禅'
const msg = defaultMessage ?? 'Hello Liu Xing';
console.log(msg); // Hello JavaScript 之禅'
如果 defaultMessage 是null
或者 undefined
则将打印出 Hello Liu Xing
当我们按顺序使用它时,它会变得更强大:
console.log(firstName ?? lastName ?? 'anonymous')
在这个例子中,如果 firstName 不是 null/undefined,它将显示 firstName, 否则,如果 lastName 不是 null/undefined,它将显示 lastName。最后,如果它们都为 null/undefined,它将显示“anonymous”。
三、使用 .map()、.reduce() 和 .filter()
接下来,谈论函数式和反应式编程的强大技术!几年前我第一次使用它时,它真的为我打开了一扇新的大门。现在每次看到这些简洁的代码,我仍然被它的美丽所震撼。
今天我举例介绍三个最常用的方法:map、reduce 和 filter。
在新冠疫情 之前,我们去巴黎度假。于是他们去超市买了些东西。他们买了食物和日用品。但是所有的物品都是欧元,他们想知道每件物品的价格以及他们食物的人民币总成本。
鉴于 1 欧元等于 7.18 元。
以传统方式,我们将使用经典循环来完成:
const items = [
{
name: 'pineapple',
price: 2,
type: 'food'
},
{
name: 'beef',
price: 20,
type: 'food'
},
{
name: 'advocate',
price: 1,
type: 'food'
},
{
name: 'shampoo',
price: 5,
type: 'other'
}
]
let sum = 0
const itemsInYuan = []
for (let i = 0; i < items.length; i++) {
const item = items[i]
item.price *= 7.18
itemsInYuan.push(item)
if (item.type === 'food') {
sum += item.price
}
}
console.log(itemsInYuan)
/*
[
{ name: 'pineapple', price: 14.36, type: 'food' },
{ name: 'beef', price: 143.6, type: 'food' },
{ name: 'advocate', price: 7.18, type: 'food' },
{ name: 'shampoo', price: 35.9, type: 'other' }
]
*/
console.log(sum) // 165.14
现在我们来使用现在 JavaScript 提供的函数式编程方法来实现这个计算。
const itemsInYuan = items.map(item => {
const itemInYuan = { ...item }
itemInYuan.price *= 7.18
return itemInYuan
})
const sum = itemsInYuan.filter(item => item.type === 'food').reduce((total, item) => total + item.price, 0)
上述示例使用map
方法将欧元转为元,使用 filter 过滤掉非食品的项目,使用 reduce 来计算价格总和。
关于 JavaScript 数组的更详细总结,推荐阅读 Javascript 数组及其方法详解
亲爱的读者,
感谢你的时间。我们下期再见!
如果你在评论区留下的想法,我会十分高兴。
往期精彩回顾:
左手代码右手砖,抛砖引玉
记得点赞,分享,在看加关注哟!