当前位置: 首页 > Web前端 > HTML5

三个值得期待的JavaScript新特性!

时间:2023-04-05 23:01:59 HTML5

让我们来看看JavaScript中即将推出的一些有用的功能。您将看到它们的语法、链接以跟上它们的进度,我们将编写一个小型测试套件来展示如何立即开始使用这些建议!JavaScript是如何迭代的如果您已经熟悉EcmaTC39委员会如何决定和处理对JavaScript语言的更改,请随意跳过本节。对于我们这些对JavaScript编程语言如何演变感到好奇的人,我想快速概述一下这个过程。JavaScript是一种称为ECMAScript的语言标准的实现,它的创建是为了标准化该语言在Web浏览器早期发展过程中的所有实现。ECMAScript标准已经有八个版本,其中有七个版本(第四个被废弃)。每个JavaScript引擎开始实施每次发布后指定的更改。该图将显示并非每个引擎都实现了每个功能,并且某些引擎比其他引擎需要更长的时间来实现它们。虽然这似乎不是最佳选择,但我相信总比没有标准要好!建议每个ECMAScript版本都经过一个审查提案的过程。如果某个提案被认为有用且向后兼容,它将包含在下一个版本中。提案分为五个阶段,如本文件所述。每个提案都是最初提出的“稻草人”或第0阶段。在这个级别,他们要么还没有提交给技术委员会,要么没有被拒绝,但仍然不符合进入下一阶段的标准。下面显示的提案都不是阶段0的一部分。作为个人建议,我想鼓励读者避免在生产应用程序中使用阶段0提案,直到它们处于不稳定阶段。这个建议只是为了避免在提案被放弃或完全改变时出现问题。测试套件编程功能的介绍通常会显示断章取义的代码片段,或者使用这些功能来构建应用程序。由于我是TDD的忠实拥护者,我相信了解功能功能的更好方法是对其进行测试。我们将使用由JimNewkirk创建的学习测试_._来执行此操作,我们在其中编写的测试不是针对我们自己的代码,而是针对编程语言本身进行断言。在学习第三方API或任何其他语言功能时,同样的概念非常有用。转译器如果您已经熟悉转译器,请随意跳过本节。你们中的一些人可能想知道我们将如何使用尚未实现的语言功能!JavaScript是一种不断发展的语言,带有一些将JavaScript编译成JavaScript的转译器。表面上听起来可能不是很有帮助,但我向你保证!它允许我们编写最新版本的JavaScript——甚至包括Phase0提案——并且仍然能够在当今的运行时环境(如Web浏览器和Node.js)中执行它。它通过将我们的代码更改为旧版本的JavaScript来实现这一点。Babel是最流行的JavaScript转译器之一。我们会马上使用它。步骤您需要安装Node.js和NPM。为此,您可以在新目录中运行以下命令:npminit-f&&npmiava@1.0.0-beta.3@babel/preset-env@7.0.0-beta.42@babel/preset-阶段-0@7.0.0-beta.42@babel/register@7.0.0-beta.42@babel/polyfill@7.0.0-beta.42@babel/plugin-transform-runtime@7.0.0-beta。42@babel/runtime@7.0.0-beta.42--save-dev然后你需要将以下内容添加到你的package.json文件中:"scripts":{"test":"ava"},"ava":{"require":["@babel/register","@babel/polyfill"]}最后创建一个.babelrc文件:{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}],"@babel/preset-stage-0"],"plugins":["@babel/plugin-transform-runtime"]}现在你可以开始编写一些测试了!1.OptionalChaining在JavaScript中,我们无时无刻不在使用对象。有时这些物体的形状并不完全符合我们的预期。您将在下面找到一个人为设计的数据对象的示例-可能是从数据库或API调用中检索的。constdata={user:{address:{street:'PennsylvaniaAvenue',},},};糟糕,该用户似乎没有完成注册:constdata={user:{},};假设,当我尝试访问应用程序仪表板时,出现以下错误:console.log(data.user.address.street);//UncaughtTypeError:Cannotreadproperty'street'ofundefined为了避免这种情况,我们目前“街道”属性必须按如下方式访问:conststreet=data&&data.user&&data.user.address&&data.user.address.street;控制台日志(街道);//undefined在我看来,this第一种方法是:不美观又繁琐又啰嗦这里是optionallink的地方。你可以这样使用它:console.log(data.user?.address?.street);//undefined这更容易,对吧?现在我们已经看到了这个特性的用处,我们可以继续深入挖掘。所以让我们写一个测试!现在我们看到可选链接保持了以前点符号的功能。接下来,让我们为不愉快的路径添加一个测试。以下是可选链接如何用于数组属性访问:有时我们不知道函数是否在Object中实现。一个常见的例子是当您使用网络浏览器时。某些较旧的浏览器可能没有某些功能。值得庆幸的是,我们可以使用可选链接来检测函数是否已实现!如果链不完整,表达式将不会被执行。在幕后,该表达式大致翻译为:value==null?值[此处的一些表达式]:未定义;可选链接运算符之后什么都没有?如果值未定义或为空,将执行。我们可以在下面的测试中看到这条规则的作用:有了它!可选链接减少了对if语句、导入库(如lodash)以及使用&&进行链接的需要。一句警告:您可能会注意到此可选链接的开销很小。你检查的每个级别?必须包裹在引擎盖下的某种条件逻辑中。如果过度使用,将导致性能损失。我建议您在接收或创建对象时使用它来进行某种对象验证。这将限制对这些检查的需求,从而减少性能损失。链接这是提案的链接。我还在这篇文章的底部复制了它,这样你就可以在一个地方看到所有的提案链接!2.NullValueMergeMerge:Fuseorfusetogether以下是我们在JavaScript中看到的一些常见操作:检查未定义或空值DefaultingValues确保0、false和空字符串不是默认值。你可能见过这样的:value!=null?值:'默认值';或者这个:价值||'defaultvalue'问题是第二次实现,我们的第三个操作条件不满足。在这种情况下,数字零、布尔值false和空字符串都被视为false。这就是为什么我们必须显式检查null和undefined的原因。value!=null这与:value!==null&&value!==undefined这就是新提议(无效合并)的来源。现在我们可以做:value??'默认值';这可以防止我们意外默认为那些虚假值,但在没有三元和的情况下仍然有效!=null检查以捕获null和undefined。现在我们看到了语法,我们可以编写一个简单的测试来验证它是如何工作的。你可以在测试中看到它使用默认值null、undefined和void0(计算结果为undefined)。它不会默认false值,如0、''和false。在此处查看GitHub。3.管道运算符在函数式编程中我们有一个术语“组合”,它是将多个函数调用链接在一起的行为。每个函数接收前一个函数的输出作为其输入。这是我们在纯JavaScript中讨论的示例:functiondoubleSay(str){returnstr+","+str;}functioncapitalize(str){returnstr[0].toUpperCase()+str.substring(1);}functionexclaim(str){returnstr+'!';}letresult=exclaim(capitalize(doubleSay("hello")));result//=>"你好,你好!"这种连接是如此普遍,以至于组合函数存在于大多数函数库中,例如lodash和ramda。有了新的管道运算符,就可以跳过第三方库,把上面的写成这样:letresult="hello"|>doubleSay|>capitalize|>exclaim;result//=>"Hello,hello!"目的是使_chain_更具可读性。它在未来的部分应用程序中也能很好地工作,或者现在可以这样实现:letresult=1|>(_=>Math.max(0,_));result//=>1letresult=-5|>(_=>Math.max(0,_));结果//=>0现在我们看到了语法,我们可以开始编写测试了!您可能会注意到的一件事是,一旦将异步函数添加到管道中,您就必须等待该值。这是因为价值变成了承诺。有一些建议更改以支持|>awaitasyncFunction,但尚未实施或决定。好吧,既然您已经看到这些技巧的实际应用,我希望您试一试!可以在此处找到学习测试的完整代码。以下是所有四个提交链接:tc39/proposal-optional-chaining_通过在GitHub._github.com[](https://github.com/TC39/propo...tc39/proposal-nullish-coalescing_proposal-nullish-coalescing-无效合并提案x??y_github.com[](https://github.com/tc39/propo...tc39/proposal-partial-application_proposal-partial-application-将部分应用程序添加到ECMAScript_github.com[](https://github.com/tc39/propo...tc39/proposal-pipeline-operator_proposal-pipeline-operator-添加简单但-的提案对JavaScript有用的管道运算符._github.com[](https://github.com/tc39/propo...