成为现代 JavaScript 大师的 3 个小技巧

JavaScript之禅

共 2823字,需浏览 6分钟

 ·

2021-12-19 15:45

☝点击上方蓝字关注我们,过早的优化是罪恶之源。🧑‍💻


通常在 Angular 或 React 项目中,code review 时看到一些老式的 JavaScript 代码,就会将开发人员归类为初学者。但是,如果你知道以下 3 个技巧,你将被视为现代 JavaScript 的尤达大师。那么,让我们开始我们的旅程吧!


▽ 正文


一、神奇的扩展运算符

扩展运算符(spread)是三个点(...), 可以说我在 JavaScript 中最喜欢的运算符了。我主要在以下 3 种情况下使用:

  1. 拷贝数组
const arr = [1234]
const newArr = [...arr]

console.log(newArr)  // [1, 2, 3, 4]
  1. 合并数组
const numArr = [1234]
const alphaArr = ['a''b''c']
const newArr = [...numArr, ...alphaArr]

console.log(newArr) // [1, 2, 3, 4, 'a', 'b', 'c']

  1. 展开对象
const rectangle = { width10height10 }
const cube = { ...rectangle, length7 }

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 的可选链操作符?.与空值合并运算符?? 可以使我们的代码更加简洁

  1. 可选链操作符

可选链操作符是访问嵌套对象属性的安全方式。这意味着在访问一长串对象属性时,我们不必进行多次空检查。当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明

以下示例检查客户地址的邮政编码是否为 null :

const client = {
  name'Liu Xing',
  address: {
    zipcode'1234'
  }
}

// 老的取值方式
if (client && client.address && client.address.zipcode) {}
// 更加现代的可选链操作符方式
if (client?.address?.zipcode) {}
  1. 空值合并运算符

空值合并操作符(??)是一个逻辑操作符,当左侧的操作数为 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',
    price2,
    type'food'
  },
  {
    name'beef',
    price20,
    type'food'
  },
  {
    name'advocate',
    price1,
    type'food'
  },
  {
    name'shampoo',
    price5,
    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 数组及其方法详解


亲爱的读者,

感谢你的时间。我们下期再见!

如果你在评论区留下的想法,我会十分高兴。


往期精彩回顾:

17 个拯救生命的 JavaScript 单行程序

Javascript 数组及其方法详解

8个必知的 SEO 优化重要元标签

HTML meta 标签详解

JavaScript中到底要不要加分号?

RESTful API 设计最佳实践

Git 工作流程及分支策略


关注公众号回复【资源】可免费领取学习资料!


左手代码右手砖,抛砖引玉

记得点赞,分享,在看加关注哟!

浏览 45
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报