ES2019 中的 JavaScript 新特性

  JavaScript 从成立之初就已经走了很长一段路,提供了许多新的功能,这些功能是专门设计来使该语言更加人性化和提升效率。以下是我最近发现的一些有趣的JavaScript 新增内容。其中一些功能已在 Node,Chrome,Firefox 和 Safari 中可用,而其他功能仍处于建议阶段。
  
  Optional chaining (可选链)
  
  Optional chaining 可选链使用 ?. 操作符来表示,Optional Chaining 使我们能检查一个对象上面是否存在某属性。其它一些语言有类似的特性。例如 C# 有 Null Conditional 操作符。而 JavaScript 的 Optional chaining 在需要深度访问嵌套对象属性时就特别有用。
  
  当我们在访问对象的属性前,我们需要用 ?. 操作符来确定该属性是否存在。
  
  首先看看下面代码:
  
  const users = [
  
  {
  
  name: "Olagunju Gbolahan",
  
  occupation: "Software Developer",
  
  sayName(){
  
  console.log(`my name is ${this.name}`);
  
  },
  
  address: { office: "New York" }
  
  },
  
  { name: "Olawaseyi Moses" },
  
  { name: "Tunde Ednut" }
  
  ];
  
  在该数组对象中,第二个对象是 secondUser:
  
  const secondUser = users[1];
  
  我们需要知道该用户的办公室地址,在没有 Optional chaining 之前,我们需要使用一种很低效的方式来验证该属性是否已存在:
  
  const theAddress = secondUser.address && secondUser.address.office;
  
  console.log(theAddress); // undefined
  
  如果我们是一个深度嵌套的对象,那就必须通过 && 操作符来判断每一层的对象是否有效:
  
  但是有了 optional chaining ,代码便可简化如下:
  
  const theAddress = secondUser?.address?.office;
  
  console.log(theAddress); // undefined
  
  我们还可以使用 optional chaining 来确认对象的某个方法是否存在:
  
  const firstUser = users[0];
  
  console.log(firstUser.sayName?.()); // 我的名字是 Olagunju Gbolahan
  
  如果方法名不存在的话,它会简单的返回 undefined :
  
  console.log(firstUser.sayOccupation?.()); // undefined
  
  目前该特性尚未添加到 JavaScript 规范中,目前还处于草案建议阶段。
  
  你可以通过 babel-plugin-proposal-optional-chaining 这个插件来实现相同功能。
  
  你也可以阅读 《Optional Chaining 特性进入 Stage 3,TypeScript 跟进》 这篇文章来了解更多关于该特性的进展。
  
  Optional catch binding (可选的错误捕获绑定)
  
  当我们事先知道错误将是什么,并且我们不希望冗余未使用的变量时,此功能将派上用场。
  
  首先看看常规的 try 和 catch 的代码块:
  
  try {
  
  const parsedJsonData = JSON.parse(obj);
  
  } catch (error) {
  
  //obj 变量在使用时没有进行定义
  
  console.log(obj);
  
  }
  
  而通过错误捕获绑定,我们无需提供未使用的变量,特别是当我们已经为 try 块提供默认处理的情况下:
  
  function getName () {
  
  let name = "Gbolahan Olagunju";
  
  try {
  
  name = obj.details.name
  
  } catch {}
  
  console.log(name);
  
  }
  
  管道操作符
  
  这是对 JavaScript 的拟议补充之一,目前处于第1阶段。本质上,它有助于使对同一参数的多个函数调用可读。
  
  它通过将表达式的值作为参数传递给函数来实现。
  
  在没有管道运算符的情况下调用以下函数|>。
  
  const capitalize = (input) => input[0].toUpperCase() + input.substring(1);
  
  const removeSpaces = (input) => input.trim();
  
  const repeat = (input) => `${input}, ${input}`;
  
  const withoutpipe = repeat(capitalize(removeSpaces(‘ i am gbols ‘)));
  
  console.log(withoutpipe); // I am gbols, I am gbols
  
  而通过管道操作符,可读性大幅提升:
  
  const withpipe = ‘ i am gbols ‘
  
  |> removeSpaces
  
  |> capitalize
  
  |> repeat;
  
  console.log(withpipe); // // I am gbols, I am gbols
  
  String.trimStart 和 String.trimEnd
  
  这两个方法在之前被命名为 trimRight 和 trimLeft,但在 ES2019 中将名字修改为 trimStart 和 trimEnd ,表述更加直观:
  
  示例代码:
  
  let message = " Welcome to LogRocket ";
  
  message.trimStart(); // "Welcome to LogRocket "
  
  message.trimEnd(); // "Welcome to LogRocket";
  
  Object.fromEntries
  
  在聊 Object.fromEntries 之前,有必要先看看 Object.entries.
  
  Object.entries 是在 ES2017 规范中引入的,用于将对象转成数组,并可通过数组相关的函数进行访问。
  
  示例代码:
  
  const devs = {
  
  gbols: 5,
  
  andrew: 3,
  
  kelani: 10,
  
  dafe: 8,
  
  };
  
  const arrOfDevs = Object.entries(devs);
  
  console.log(arrOfDevs);
  
  //[
  
  // ["gbols", 5]
  
  // ["andrew", 3]
  
  // ["kelani", 10]
  
  // ["dafe", 8]
  
  //]
  
  然后我们可以使用 filter 方法来获取数组中超过 5 年经验的对象:
  
  const expDevs = arrOfDevs.filter(([name, yrsOfExp]) => yrsOfExp > 5);
  
  console.log(expDevs);
  
  //[
  
  // ["kelani", 10]
  
  // ["dafe", 8]
  
  //]
  
  那么就会有一个新的问题:没有一个简单的方法将最新的数组重新变成对象。通常我们需要自己编写代码将数组变成对象:
  
  const expDevsObj = {};
  
  for (let [name, yrsOfExp] of expDevs) {
  
  expDevsObj[name] = yrsOfExp;
  
  }
  
  console.log(expDevsObj);
  
  //{
  
  //dafe: 8
  
  //kelani: 10
  
  //}
  
  但是现在通过 Object.fromEntries 就可以把这个过程极大简化:
  
  console.log(Object.fromEntries(expDevs));
  
  //{
  
  //dafe: 8
  
  //kelani: 10
  
  //}
  
  Flat
  
  很多使用我们需要处理深度嵌套的数组,这个时候将数组展平就特别重要。
  
  先看看如下代码:
  
  const developers = [
  
  {
  
  name: ‘Gbolahan Olagunju‘,
  
  yrsOfExp: 6,
  
  stacks: [‘Javascript‘, ‘NodeJs‘, [‘ReactJs‘, [‘ExpressJs‘, ‘PostgresSql‘]]]
  
  },
  
  {
  
  name: ‘Daniel Show‘,
  
  yrsOfExp: 2,
  
  stacks: [‘Ruby‘, www.yuntianyul.com ‘Jest‘, [‘Rails‘, [‘JQuery‘, ‘MySql‘]]]
  
  },
  
  {
  
  name: ‘Edafe Emunotor‘,
  
  yrsOfExp: 9,
  
  stacks: [‘PHP‘, ‘Lumen‘, [‘Angular‘, ‘NgRx‘]]
  
  }
  
  ];
  
  const allStacks www.baichuangyule.cn= developers.map(({stacks}) => stacks);
  
  console.log(allStacks);
  
  // [
  
  // [‘Javascript‘, ‘NodeJs‘, [‘ReactJs‘, [‘ExpressJs‘, ‘PostgresSql‘]]]
  
  // [‘Ruby‘, ‘Jest‘, [‘Rails‘www.jintianxuesha.com, [‘JQuery‘, ‘MySql‘]]]
  
  // [‘PHP‘, ‘Lumen‘, [‘Angular‘, ‘NgRx‘]]
  
  // ]
  
  allstacks 变量包含深度嵌套的数组,为了将该数组展平,我们可以使用 Array.prototype.flat 方法。
  
  示例代码:
  
  const flatSingle = allStacks.flat();
  
  console.log(flatSingle);
  
  //[
  
  // "JavaScript",
  
  // "NodeJs",
  
  // [‘ReactJs‘, [‘ExpressJs‘www.yuchengyuledl.com, ‘PostgresSql‘]]]
  
  // "Ruby",
  
  // "Jest",
  
  // [‘Rails‘, [‘JQuery‘, ‘MySql‘]]]
  
  // "PHP",
  
  // "Lumen"
  
  // ["Angular", "NgRx"]
  
  //]
  
  从上面代码可以推断出数组被展平了一层深,这是 array.prototype.flat 的默认参数。
  
  我们可以向flat方法传递一个参数,以确定要展平的程度。
  
  defaults 参数的值为1。为了完全展平数组,我们可以传递一个无穷大的参数。参数 infinity 使数组完全变平,与数组的深度无关。
  
  示例代码:
  
  const completelyFlat www.fengshen157.com= allStacks.flat(Infinity);
  
  console.log(completelyFlat);
  
  //[
  
  // "JavaScript",
  
  // "NodeJs",
  
  // "ReactJs",
  
  // "ExpressJs",
  
  // "PostgresSql",
  
  // "Ruby",
  
  // "Jest",
  
  // "Rails",
  
  // "JQuery",
  
  // "MySql",
  
  // "PHP",
  
  // "Lumen",
  
  // "Angular",
  
  // "NgRx"
  
  //]
  
  FlatMap
  
  FlatMap 相当于将 map 方法和 flat 方法合并起来,并默认使用深度为 1 的新方法。相当于是以更简洁的代码实现两种逻辑的组合。
  
  下面是一个简单使用 map 和 flatMap 的代码:
  
  let arr = [‘my name is Gbols‘, ‘ ‘, ‘and i am great developer‘];
  
  console.log(arr.map(word => word.split(‘ ‘)));
  
  //[
  
  // ["my", "name", "is", "Gbols"],
  
  // ["", ""],
  
  // ["and", "i", "am",www.qjljdgt.cn "great", "developer"]
  
  //]
  
  console.log(arr.flatMap(word => word.split(‘ ‘)));
  
  //[ "my"
  
  // "name"
  
  // "is"
  
  // "Gbols"
  
  // ""
  
  // ""
  
  // "and"
  
  // "i"
  
  // "am"
  
  // "great"
  
  // "developer"
  
  //]
  
  总结
  
  在这篇文字中,我们详细介绍了一些 JavaScript 最新添加的新特性,这些新的特性通过减少冗长的代码以及提升代码的可读性来增强了开发者的体验。不过还有很多新的特性在本文中没有涉及,欢迎大家补充和分享。

原文地址:https://www.cnblogs.com/dakunqq/p/11613656.html

时间: 2024-10-08 00:03:58

ES2019 中的 JavaScript 新特性的相关文章

ES6:JavaScript 新特性

5月14日,国务院发布了<国务院关于同意建立深化收入分配制度改革部际联席会议制度的批复>,同意建立由发改委牵头的深化收入分配制度改革部际联席会议制度.这是对政府一年多前首次发布的关于收入分配制度改革若干意见的落实,标志着中国收入分配改革迈出了实质性一步.根据批复,联席会议由国家发改委.财政部.人力资源和社会保障部等21个部门和单位组成.发改委主任徐绍史担任联席会议召集人,其他成员单位有关负责人为联席会议成员. 国务院下发的文件显示,部际联席会议制度的主要职责包括:在国务院领导下,统筹协调做好深

javascript新特性

让我们看看javascript中的一些新特性.本文将介绍它们的语法和相关链接,以帮助读者及时了解它们的进展.我们将通过编写一个小测试项目来演示如何快速使用这些新功能! 关于提案 提案分为五个阶段.有关详细信息,请参阅介绍文档https://tc39.github.io/process-document/.每项提案最初都以“斯特劳曼”或第0阶段休闲鹿提出,在这一阶段,它们要么没有提交给技术委员会,要么没有被否决,但尚未进入下一阶段. 作为个人建议,读者应避免在处于不稳定阶段的生产环境中使用阶段0建

MVC中的其他新特性

MVC中的其他新特性 (GlobalImport全局导入功能) 默认新建立的MVC程序中,在Views目录下,新增加了一个_GlobalImport.cshtml文件和_ViewStart.cshtml平级,该文件的功能类似于之前Views目录下的web.config文件,之前我们在该文件中经常设置全局导入的命名空间,以避免在每个view文件中重复使用@using xx.xx语句.默认的示例如下: @using BookStore @using Microsoft.Framework.Optio

解读ASP.NET 5 &amp; MVC6系列(17):MVC中的其他新特性

原文:解读ASP.NET 5 & MVC6系列(17):MVC中的其他新特性 (GlobalImport全局导入功能) 默认新建立的MVC程序中,在Views目录下,新增加了一个_GlobalImport.cshtml文件和_ViewStart.cshtml平级,该文件的功能类似于之前Views目录下的web.config文件,之前我们在该文件中经常设置全局导入的命名空间,以避免在每个view文件中重复使用@using xx.xx语句.默认的示例如下: @using BookStore @usi

VS2015 C#6.0 中的那些新特性

? VS2015 C#6.0 中的那些新特性 前言 ? ? ? VS2015在自己机器上确实是装好了,费了老劲了,想来体验一下跨平台的快感,结果被微软狠狠的来了一棒子了,装好了还是没什么用,应该还需要装Xarmain插件,配置一些参数吧,由于这块之前从未接触过,想了想还是先不把时间继续浪费在这里了,于是乎来体验一下新特性了. 本人个人博客原文链接地址为http://aehyok.com/Blog/Detail/66.html. ? ?本文参考http://roslyn.codeplex.com,

Oracle12c中数据泵新特性之功能增强(expdp, impdp)

Oracle12c中数据泵新特性之功能增强(expdp, impdp) Oracle的数据泵功能在10g中被引进.本文对数据泵在12c中的增强做一个概览. 1.   禁用日志选项(DISABLE_ARCHIVE_LOGGING) Impdp的TRANSFORM参数已经扩展为包括DISABLE_ARCHIVE_LOGGING选项.该选项的默认值为 "N",不会影响日志行为.将该选项设置为"Y",这将会使表和索引在导入前将日指属性设置为NOLOGGING,从而导入期间减

HTML5和CSS3中的交互新特性

当文章的标题是一副用photoshop制作的图片,那么势必在搜索引擎中无法搜索到.并且因为图片的体积不算小.可能在网速慢的的时候不得不耐心的等待图片的刷新. 所以.我们来谈谈有没有一种新的方法能够避免这些缺点. 什么是HTML5和CSS3 HTML和CSS并不难理解.HTML为构成网页的主要语言.通过这样的语言.我们能够向计算机说明网页格式.内容.显示效果等等.而CSS则是专门用来控制网页显示效果的语言. HTML 5的新特性 1. 新的内容标签 HTML4中的内容标签级别同样,无法区分各部分内

黑马程序员------Java中jdk1.5新特性

Java培训.Android培训.iOS培训..Net培训.期待与您交流! JDK1.5新特性: 为什么会出现新特性: 新的技术出现是为了解决老的问题,Java语言为了提高开发者的开发效率,对之前的某些不利于提高效率的技术进行改进. 静态导入: 静态导入:可以导入某个类下的静态方法,静态导入后,可以不写类名而直接使用此类下的静态方法. 语法:import static 包名.类名.静态方法 代码示例: package com.itheima.day1; /** * 静态导入 * @author

VS2013中F#的新特性

为了更好的迎接新版本的到来,先看一下之前F#的特性. 1.为区分联合(discriminated unions)添加了命名域,使代码更加清晰. 2.用新数据的新特性,使矢量和矩阵编码更容易的工作 3.更强大的泛型算法的扩展 4.得到更好的调试支持,当你使用F #调试时,调试编译器和解释器选项. 5.当你使用LINQ扩展方法如select时,lambda表达式将使你的代码非常简浩. 6.使用.NET框架4.5.1和Windows商店简化版的库支持. 7.支持同时在当前和以前的版本的VisualSt