现代JavaScript,你应该使用的10件事

news2024/12/28 18:43:07

javascripttip(3 部分系列)

1现代 JavaScript,你应该使用的 10 件事,从今天开始

2了解如何在 JavaScript 中使用循环

3如何在 JavaScript 中学习足够多的 RegEx 才能变得危险

您可能对 JavaScript 完全陌生,也可能多年来只是偶尔使用过它。不过有一件事很清楚——很多地方都变了,有些功能你应该使用。如果你认真对待 JavaScript,这篇文章描述了我认为你应该每天使用的特性

资源

这些是我最喜欢的 ES6+ 资源:

  • ES6 特性

  • MDN

-1- 展开运算符

这被表示为...对象或数组之前的 a 并且完成了名称所说的内容,它将某些东西从结构变成了逗号分隔的列表。让我们证明这一点:

展开数组

let firstHalf = [ 'one', 'two'];
let secondHalf = ['three', 'four', ...firstHalf];

这是一种非常简洁的编写方式。没有这个就做同样的事情意味着做这样的事情:

NO阵列传播

let firstHalf = [ 'one', 'two'];


let secondHalf = ['three', 'four'];
for(var i=0, i <firstHalf.length; i++ ) {
  secondHalf.push(firstHalf[i]);
}

这也可以用于对象,作为合并其属性的一种方式:

传播对象

const hero = {
  name: 'Xena - Warrior Princess',
  realName: 'Lucy Lawless'
}


const heroWithSword = {
 ...hero,
 weapon: 'sword'
}

以困难的方式执行此操作将是我们遍历对象的所有属性:

没有物体传播

let keys = Object.keys(hero);
let obj = {};

for(var i=0; i< keys.length; i++) {
   obj[keys[i]] = keys[props[i]];
}

公平地说,还有Object.assign(), 看起来像这样:

const heroWithSword = Object.assign({}, hero, {weapon:"sword"})

我仍然会争辩说这是一个更容易阅读的东西:

const heroWithSword = {
 ...hero,
 weapon: 'sword'
}

-2- 休息参数

剩余参数是关于将剩余的参数收集到一个数组中。JavaScript 能够灵活处理您为其提供的输入参数的数量。通常有一个arguments收集这些的变量。让我们看看我们的意思:

function add(first, second, ...remaining) {
  return first + second;
}

现在,以上仅总结了参数firstsecond。这意味着用add(1,2)or调用它add(1,2,3, 4)会产生相同的结果。要解决此问题,我们将键入:

function add(first, second, ...remaining) {
  return first + second + remaining.reduce((acc, curr) => acc + curr, 0);
}

以上意味着我们正在解决问题并使用所有输入参数。

如前所述,使用剩余参数,即添加前面的参数...作为收集剩余参数的方式,是我们命名它们并使我们更明确地表示我们想要使用它们的一种方式。arguments至少从 ES5 开始就存在,但我认为鲜为人知。

-3- 字符串插值

你见过这样的说法吗?

class Product {
 constructor(name, description, price) {
   this.name = name;
   this.description = description;
   this.price = price;
 }

 getDescription() {
   return " Full description \n" + 
   " name: " + this.name + 
   " description: " + this.description

 }
}

我当然是在谈论getDescription()方法,一个长的、多行的、难以阅读的语句。这在大多数编程语言中都是现实。在某些语言中也可以使用字符串插值,幸运的是 JavaScript 也不例外。我们可以将我们的getDescription()方法变成如下:

getDescription() {
   return `Full description \n: 
   name: ${this.name}
   description ${this.description}
   `;

 }

所以双反引号`是我们用来定义多行字符串的。我们也使用${}插值。希望你的世界现在好多了:)

-4- 速记属性

您可能在不了解它的情况下使用它。在 ES5 中,您必须编写以下内容:

function createCoord(x, y) {
  return {
    x: x,
    y: y
  }
}

:在 ES6 及以后的版本中,如果名称相同,则可以省略右边的内容,如下所示:

function createCoord(x, y) {
  return {
    x,
    y
  }
}

看起来不那么杂乱吧?

-5- 方法属性

这就是您定义指向对象中方法的属性的方式。考虑以下 ES5 示例:

const math = {
  add: function(a,b) { return a + b; },
  sub: function(a,b) { return a - b; }, 
  multiply: function(a,b) { return a * b; }
}

你实际上不需要拥有add:ES6 及以后的全部业务。你可以像这样输入它:

const math = {
  add(a,b) { return a + b; },
  sub(a,b) { return a - b; },
  multiply(a,b) { return a * b; }
}

-6- 解构

解构关乎您作为开发人员的精神健全。

对象解构

考虑以下代码:

function handle(req, res) {
 const name = req.body.name;
 const description = req.body.description;
 const url = req.url;

 log('url endpoint', url);

 // lots of logic happening
 dbService.createPerson( name, description )
}

上面的代码无论如何都不完美,但它确实代表了我们想要从不同级别的对象中挖掘数据的情况。你问的问题是什么?好吧,如果我不必声明所有这些变量并节省一些击键会怎么样?你可以这样做:

function handle(req, res) {
 const { body: { name, description }, url }, = req;

 log('url endpoint', url);

 // lots of logic happening
 dbService.createPerson( name, description )

在上方,您可以看到三行如何变成一行。

数组解构

这不仅限于对象。它也可以在数组上完成。考虑以下代码:

const array = [1,2,3,4,5,6];

const a = array[0];

const c = array[2];

这可以以更优雅的方式完成,如下所示:

const array = [1,2,3,4,5,6];
const [a, ,c, ...remaining] = arr;

// remaining = [4,5,6]

我们可以通过上面的模式匹配从数组中分解出值。如果我们想跳过我们输入, ,的内容,作为奖励,我加入了一个 REST 语句来获取剩余的项目。

参数匹配

我们也可以对函数及其参数执行此操作。当函数中有超过 2-3 个参数时,收集对象中的所有参数已成为事实上的标准,因此您得到的函数如下所示:

function doSomething(config) {
  if(config.a) { ... }
  if(config.b) { ... }
  if(config.c) { ... }
}

更好的方法是:

function doSomething({ a, b, c }) {
  if(a) { ... }
  if(b) { ... }
  if(c) { ... }
}

-7- 数组方法

ES6 带来了大量可用的数组方法,例如:

  • find(), 在列表中找到一个项目,否则为 null

  • findIndex(), 找到项目的索引

  • some(), 列表中至少一项的谓词为真

  • includes(), 是列表的项目部分

考虑以下代码以了解用法:

const array = [{ id: 1, checked: true }, { id: 2 }];
arr.find(item => item.id === 2) // { id: 2 }
arr.findIndex(item => item.id === 2) // 1
arr.some(item => item.checked) // true

const numberArray = [1,2,3,4];
numberArray.includes(2) // true

-8- 承诺 + 异步/等待

如果你在这个街区呆了一段时间,你可能还记得我们只有回调的时候,就像这样:

function doSomething(cb) {
  setTimeout(() =>  {
    cb('done')
  }, 3000)
}

doSomething((arg) => {
 console.log('done here', arg);
})

我们用它来处理一些操作是异步的并且需要时间才能完成的事实。然后我们得到了人们开始使用的 promise 库,最终,我们得到了语言的原生支持。所以现在我们可以做这样的事情:

function doSomething() {
  return new Promise((resolve, reject) => {
    setTimeout(() =>  {
      resolve('done')
    }, 3000)
  })
}

doSomething().then(arg => {
 console.log('done here', arg);
})

我们甚至可以链接整个体验,这样我们就可以像这样进行调用:

getUser()
  .then(getOrderByUser)
  .then(getOrderItemsByOrder)
  .then(orderItems => {
    // do something with order items
  })

异步/等待

然后我们得到了async/await,生活变得更加美好。考虑上面的例子,Promises 现在变成了这样:

async function getItems() {
  try {
    const user = await getUser();
    const order = await getOrderByUser(user);
    const items = await getOrderItemsByOrder(order);
    return items;
  } catch(err) {
    // handle error here, the suggestion to return something or rethrow
  }
}

getItems().then(items => {
  // do something with order items
})

我们得到了一个看起来同步的异步代码。:)

-9- 模块

几乎所有编码语言都支持模块的概念。将代码划分为许多不同文件的能力,这些文件也是独立的单元,即所谓的模块。考虑以下代码:

// math.js

export function add(a,b) { return a + b; }
export function sub(a,b) { return a - b; }

export default (a,b) => a * b;

// main.js
import mult, { add, sub } from './math';

mult(2, 4) // 8
add(1,1)   // 2
sub(1,2)   // -1

上面我们使用export关键字来表示这些构造add并且sub对于导入该模块的任何模块都是公开可用的。如果我们只导入它,export default关键字就是我们得到的。在main.js我们将默认值导入为具有名称的情况下mult,我们还专门挑选出方法add()sub()

-10- 箭头函数 + 词法this

我在整篇文章中一直使用箭头函数,它只是另一种函数符号。以前我们只能这样写函数:

function printArray(arr) {
 // do something
}

现在我们可以将其定义为:

const printArray = (arr) => {
 // do something
}

一行函数

我们还可以将函数定义为单行代码:

const add = (a,b) => a + b

这自动意味着我们执行操作并返回结果。我们可以这样做并返回一个对象,然后我们的语法变为:

const create = (a,b) = > ({ x: a, y: b })

词汇 this

我们过去常常面临的问题是不知道什么this是。考虑以下问题:

let array = [1,2,3];

function sum() {
  this.total = 0;

  arr.forEach(function(item) {
    this.total+= item;  // `this` is the inner functions `this`, BAD
  })
  return total;
} 

this在上面的例子里面点错了forEach。我们过去解决这个问题的方法是:

function sum() {
  this.total = 0;
  var self = this;

  arr.forEach(function(item) {
    self.total+= item;  // now we are using `self`, it solves it but feels hacky
  })
  return total;
} 

箭头函数解决了这个问题,没有更多了self,所以现在代码看起来像这样:

function sum() {
  this.total = 0;

  arr.forEach((item) => {
    this.total+= item;  // all is well `this` points to outer function
  })
  return total;
} 

赢了!

概括

关于 ES6 和后续版本,我还有很多事情可以提,但我只想向您展示我认为您今天应该采用的我最喜欢的东西 :)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件学习笔记

删除线格式 ## 文件描述符 1.文件文件内容文件属性。 2.文件操作文件内容的操作文件属性的操作。 3.所谓的“打开”文件&#xff0c;是指将文件的属性或内容加载到内存中—这是由冯诺依曼决定。 4.所以文件不全打开&#xff0c;不打开的文件放在磁盘存储。 5.内存文件&#xff…

在线教育-谷粒学院学习笔记(三)

文章目录1 搭建前端项目环境2 前端页面框架介绍3 讲师管理前端开发4 后台系统登录功能改造到本地5 前端框架开发过程6 讲师列表前端实现7 讲师分页前端实现8 讲师条件查询前端实现9 讲师删除功能前端实现10 讲师添加前端实现11 讲师修改前端实现12 前端路由切换问题解决1 搭建前…

Linux工具学习之【gdb】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Whatever is worth doing is worth doing well. 任何值得去做的事情&#xff0…

【HTML】一款可交互的响应式登陆注册表单,你确定不来看看嘛(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

2022年五一杯数学建模C题火灾报警系统问题求解全过程论文及程序

2022年五一杯数学建模 C题 火灾报警系统问题 原题再现&#xff1a; 二十世纪90年代以来&#xff0c;我国火灾探测报警产业化发展非常迅猛&#xff0c;从事火灾探测报警产品生产的企业已超过100家&#xff0c;年产值达几十亿元&#xff0c;已经成为我国高新技术产业的一个组成…

Docker之Nginx部署前端项目

目录 创建nginx容器 nginx.conf讲解 ①所有配置必须以“;”结尾 ②nginx发布java项目 nginx发布静态vue项目 nginxtomcat实现反向代理及均衡 nginxhtml静态服务器 创建nginx容器 docker run –name mynginx -d -p 80:80 -v /data/nginx/conf/nginx.conf:/etc/nginx/ngin…

6款强烈推荐的 SD卡/内存卡数据恢复软件

SD卡/内存卡在 21 世纪的作用比以往任何时候都更加重要。众所周知&#xff0c;SD卡/内存卡具有高数据传输率并且是便携式设备&#xff0c;大多数摄影师甚至智能手机用户主要依靠它们来保存所有个人或项目照片和视频。此外&#xff0c;SD 卡还因其与各种设备的兼容性而广受欢迎。…

JUC并发编程学习笔记——AQS个人理解

1. AQS引出 1.1 前置知识&#xff1a; 线程创建的四种方式&#xff1a;Thread、Runnable、callable、线程池 LockSupport的使用&#xff1a;park()和unpark()方法 LockSupport是一个工具类&#xff0c; 提供了基本的线程阻塞和唤醒功能&#xff0c;它是创建锁和其他同步组件的…

使用 NVIDIA NeuralVDB优化大规模稀疏

使用 NVIDIA NeuralVDB优化大规模稀疏 基于 OpenVDB 过去十年的发展&#xff0c;NVIDIA NeuralVDB 的推出对于处理极其庞大和复杂的数据集的开发人员和研究人员来说是一个游戏规则的改变者。 NVIDIA NeuralVDB 的预发布版本为 OpenVDB 带来了 AI 和 GPU 优化&#xff0c;将烟雾…

【OpenCV】:OpenCV人脸识别项目杂记

项目目标&#xff1a; 1.图片人脸识别 2.视频人脸识别 3.ESP32Cam摄像头网页视频人脸识别 项目效果视频&#xff1a; ESP32Cam摄像头人脸识别OpenCV本地视频人脸识别ESP32Cam摄像头人脸检测项目基础代码内容&#xff1a; 一、读取图片 # 导入cv模块 import cv2 as cv# 读取图…

如何设置Excel表格以“只读模式“打开

设置Excel表格以“只读模式”打开&#xff0c;可以防止意外修改表格内容&#xff0c;因为“只读模式”下的Excel无法直接保存&#xff0c;这样就不用担心表格意外修改&#xff0c;关闭时又不小心保存了。 这个模式我们可以通过“另存为”的方法来设置。 打开Excel表格后&…

【学习笔记之Linux】工具之gcc/g++

背景知识&#xff1a; gcc/g是一个编译器&#xff0c;注意区分编译器和编辑器&#xff0c;vim是是编辑器。简单的说&#xff0c;编辑器是我们敲代码的工具&#xff0c;我们在编辑器上写出我们需要实现的功能&#xff1b;编译器负责实现功能&#xff0c;把我们写的高级语言编译成…

马蹄集 古人的剩余定理

古人的剩余定理 难度&#xff1a;白银 ©时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 今有物不知其数&#xff0c; 三三数之剩二&#xff0c; 五五数之剩三&#xff0c; 七七数之剩二。 问物最少几何&#xff1f; #include <bits/stdc.h> using nam…

使用Paddle飞桨重写波士顿房价预测案例

1.Paddle飞桨设计之“道” 当读者使用飞桨框架编写多个深度学习模型后&#xff0c;会发现程序呈现出“八股文”的形态。即不同的程序员、使用不同模型、解决不同任务的时候&#xff0c;他们编写的建模程序是极其相似的。虽然这些设计在某些“极客”的眼里缺乏精彩&#xff0c;…

XJar加密工具java打的包jar包加密运行,防止反编译

XJar功能特性 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动&#xff0c;动态解密运行的方案&#xff0c;避免源码泄露以及反编译。支持Maven插件加密过程需要Go环境&#xff1b;加密后生成Go启动器&#xff0c;保护密码不泄露GitHub: GitHub - core-l…

JSP SSM网上预约挂号系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSPSSM网上预约挂号系统 是一套完善的系统源码&#xff0c;对理解JSP java SrpingMVC mybiats 框架 MVC编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档 &#xff0c;系统主要采用B/S模式开发。研究的基本内容…

马蹄集 非常大的N

非常大的N 难度&#xff1a;白银 时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 编写程序求11/2-21/231/2-41/251/2..N1/2。 格式 输入格式&#xff1a;输入为正整数 输出格式&#xff1a;输出为浮点型&#xff08;保留六位小数&#xff09;。 #include <bits/stdc.h…

系统排障掉坑背锅?亚马逊云科技要为开发者研发提效了

出品 | CSDN 云计算任何中大型企业里的 IT 系统&#xff0c;都会有多个业务应用、多种开发语言、技术栈并存。尤其要进入云上现代化应用开发的企业和开发者&#xff0c;将面对云原生庞杂的技术分支。开发者的苦与痛&#xff1a;非功能性研发、故障排查被甩锅然而&#xff0c;IT…

深夜修复Linux桌面无法启动

玩了很久了&#xff0c;突然想学习一下&#xff0c;想做一个KDE任务栏的网速插件。 Netspeed Widget - KDE Store GitHub - dfaust/plasma-applet-netspeed-widget: Plasma 5 widget that displays the currently used network bandwidth deepin15 注销切换到 KDE Ctrl Alt …

Idea同步失败Unresolved dependency的解决办法

下载一些开源的库&#xff0c;经常会碰到一些同步问题&#xff0c;本文就该系列问题单独开一篇文章&#xff0c;和大家缕一缕这样的问题怎么解决。文章在实践过程中会保持同步更新&#xff0c;大家可以点击收藏以便于下次遇到类似问题可以快速找到解决办法。 IDEA的同步问题多…