广州蓝景分享—6 个ES13 中非常实用的新 JavaScript 特性

news2024/11/23 23:04:44

在这里插入图片描述

首先作为前端最重要的编程语言JavaScript,每年都在不断发展,让该语言都会通过新功能变得更强大。今天由小蓝跟大家分享6 个ES13 中非常实用的新 JavaScript 特性。

接下来让我们开始:

1.at

当我们想要获取数组的第 N 个元素时,我们通常使用 [] 来获取。

const array = [ 'fatfish', 'medium', 'blog', 'fat', 'fish' ]
console.log(array[ 1 ], array[ 0 ]) // medium fatfish

哦,这似乎不是什么稀罕事。但是请朋友们帮我回忆一下,如果我们想得到数组的最后第N个元素,我们会怎么做呢?

const array = [ 'fatfish', 'medium', 'blog', 'fat', 'fish' ]
const len = array.length
console.log(array[ len - 1 ]) // fish
console.log(array[ len - 2 ]) // fat
console.log(array[ len - 3 ]) // blog

这看起来很难看,我们应该寻求一种更优雅的方式来做这件事。是的,以后请使用数组的at方法!

它使您看起来像高级开发人员。

const array = [ 'fatfish', 'medium', 'blog', 'fat', 'fish' ]
console.log(array.at(-1)) // fish
console.log(array.at(-2)) // fat
console.log(array.at(-3)) // blog

2.Object.hasOwn

是的,通常有两种方式,它们有什么区别呢?

对象中的“名称”

obj.hasOwnProperty(‘名称’)

“in”运算符

如果指定属性在指定对象或其原型链中,则 in 运算符返回 true。

const Person = function (age) {
this.age = age
}
Person.prototype.name = 'fatfish'
const p1 = new Person(24)
console.log('age' in p1) // true
console.log('name' in p1) // true pay attention here

obj.hasOwnProperty

hasOwnProperty 方法返回一个布尔值,指示对象是否具有指定的属性作为其自身的属性(而不是继承它)。

使用上面相同的例子

const Person = function (age) {
this.age = age
}
Person.prototype.name = 'fatfish'
const p1 = new Person(24)
console.log(p1.hasOwnProperty('age')) // true
console.log(p1.hasOwnProperty('name')) // fasle pay attention here

也许“obj.hasOwnProperty”已经可以过滤掉原型链上的属性,但在某些情况下并不安全,会导致程序失败。

Object.create(null).hasOwnProperty('name')
// Uncaught TypeError: Object.create(...).hasOwnProperty is not a function

Object.hasOwn

不用担心,我们可以使用“Object.hasOwn”来规避这两个问题,比“obj.hasOwnProperty”方法更方便也更安全。

let object = { age: 24 }
Object.hasOwn(object, 'age') // true
let object2 = Object.create({ age: 24 })
Object.hasOwn(object2, 'age') // false The 'age' attribute exists on the prototype
let object3 = Object.create(null)
Object.hasOwn(object3, 'age') // false an object that does not inherit from "Object.prototype"

3.在模块的顶层使用“await”

来自 mdn 的 await 操作符用于等待一个 Promise 并获取它的 fulfillment 值。

const getUserInfo = () => {
return new Promise((rs) => {
setTimeout(() => {
rs({
name: 'fatfish'
})
}, 2000)
})
}
// If you want to use await, you must use the async function.
const fetch = async () => {
const userInfo = await getUserInfo()
console.log('userInfo', userInfo)
}
fetch()
// SyntaxError: await is only valid in async functions
const userInfo = await getUserInfo()
console.log('userInfo', userInfo)

在这里插入图片描述

事实上,在 ES13 之后,我们可以在模块的顶层使用 await,这对于开发者来说是一个非常令人高兴的新特性。那太棒了。

const getUserInfo = () => {
return new Promise((rs) => {
setTimeout(() => {
rs({
name: 'fatfish'
})
}, 2000)
})
}
const userInfo = await getUserInfo()
console.log('userInfo', userInfo)

在这里插入图片描述

4.使用“#”声明私有属性

以前我们用“_”来表示私有属性,但是不安全,仍然有可能被外部修改。

class Person {
constructor (name) {
this._money = 1
this.name = name
}
get money () {
return this._money
}
set money (money) {
this._money = money
}
showMoney () {
console.log(this._money)
}
}
const p1 = new Person('fatfish')
console.log(p1.money) // 1
console.log(p1._money) // 1
p1._money = 2 // Modify private property _money from outside
console.log(p1.money) // 2
console.log(p1._money) // 2

我们可以使用“#”来实现真正安全的私有属性

class Person {
#money=1
constructor (name) {
this.name = name
}
get money () {
return this.#money
}
set money (money) {
this.#money = money
}
showMoney () {
console.log(this.#money)
}
}
const p1 = new Person('fatfish')
console.log(p1.money) // 1
// p1.#money = 2 // We cannot modify #money in this way
p1.money = 2
console.log(p1.money) // 2
console.log(p1.#money) // Uncaught SyntaxError: Private field '#money' must be declared in an enclosing class

5. 更容易为类设置成员变量

除了通过“#”为类设置私有属性外,我们还可以通过一种新的方式设置类的成员变量。

class Person {
constructor () {
this.age = 1000
this.name = 'fatfish'
}
showInfo (key) {
console.log(this[ key ])
}
}
const p1 = new Person()
p1.showInfo('name') // fatfish
p1.showInfo('age') // 1000

现在你可以使用下面的方式,使用起来确实更加方便。

class Person {
age = 1000
name = 'fatfish'
showInfo (key) {
console.log(this[ key ])
}
}
const p1 = new Person()
p1.showInfo('name') // fatfish
p1.showInfo('age') // 1000

6.从数组末尾查找元素

当我们想从数组中找到满足一定条件的元素时,find 和 findIndex 都是不错的选择。

const array = Array(10000000).fill(1)
array.push(2)
const d1 = Date.now()
const el = array.find((el) => el >= 2)
const d2 = Date.now()
console.log({ el, time: d2 - d1 })

在这里插入图片描述

得到2,查找时间用了84毫秒,这是一个很恐怖的数字,而且耗时太长了。

幸运的是,从 ES13 开始,如果你之前指定目标元素更靠近尾部,使用 findLast 将大大减少其查找时间。

const array = Array(10000000).fill(1)
array.push(2)
const d1 = Date.now()
const el = array.findLast((el) => el >= 2)
const d2 = Date.now()
console.log({ el, time: d2 - d1 })

在这里插入图片描述

总结

通过以上文章对JavaScript新特性的介绍,如果想要了解更多前端开发技术,可以关注我们,也可以一起讨论。

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

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

相关文章

Redis底层设计与源码分析---学习笔记

一.Redis为什么快 高速的存储介质 机械硬盘—>固态硬盘—>内存,随机访问的延迟逐渐变小 优良的底层数据结构设计 底层设计用到了hashtable,时间复杂度低 高效的网络IO模型 epoll等,不同平台有不同的实现   高效的线程模型 二.Re…

【论文阅读笔记|ACL2022】Legal Judgment Prediction via Event Extraction with Constraints

论文题目:Legal Judgment Prediction via Event Extraction with Constraints 论文来源:ACL2022 论文链接:https://aclanthology.org/2022.acl-long.48.pdf 代码链接:GitHub - WAPAY/EPM 0 摘要 近年来,虽然法律判…

动态内存管理--->(经典入手版详解)

友友们有时候在开辟内存的时候,所需要的空间大小不太好确定,只有在程序运行的时候才能知道,这时候我们就要尝试一下动态内存开辟空间了,下面来和阿博一起了解并掌握它吧🤗🤗🤗 文章目录 1.为什么…

系统的部署

把报错的三个给删了,系统可以运行了我猜测它对应的是商品分类页面 我觉得它分页器有问题所以研究了下userdto和mtuser的区别 Failed to parse configuration class [com.fuint.fuintApplication]; nested exception is java.lang.IllegalArgumentException: Could…

Mycat数据库中间件 mycat2 路由转发

1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的。例如下图中的一个Mycat分库方案: 根据 tt_waybill 表的 id 字段来进行分片 分片方法为 id 值取 3 的模,根据模值确定在DB1,DB2,DB3中的某个分片 非分片字段…

ESP32设备驱动-LPS25H压阻式压力传感器驱动

LPS25H压阻式压力传感器驱动 文章目录 LPS25H压阻式压力传感器驱动1、LPS25H介绍2、硬件准备3、软件准备4、驱动实现1、LPS25H介绍 LPS25H 是一款超紧凑型绝对压阻式压力传感器。它包括一个单片传感元件和一个能够从传感元件获取信息并向外部世界提供数字信号的 I2C 接口。 传…

leetcode两数、三数、四数之和

如有错误,感谢不吝赐教、交流 文章目录 两数之和题目方法一:暴力两重循环(不可取)方法二:HashMap空间换时间 三数之和题目方法一:当然是暴力破解啦方法二:同两数之和的原理,借助Has…

工厂管理系统该如何选?5款主流的工厂管理软件全测评!

工厂管理系统该如何选?5款主流的工厂管理软件全测评! 阅读本文您将了解:1.工厂管理系统软件是什么;2.五大主流工厂管理系统介绍;3.如何选择工厂管理系统。 一、工厂管理系统软件是什么? 工厂管理系统软件…

SpringBoot整合JUnit--MyBatis--MyBatis-Plus--Druid

文章转自黑马程序员SpringBoot学习笔记,学习网址:黑马程序员SpringBoot2教程 1.整合JUnit ​ SpringBoot技术的定位用于简化开发,再具体点是简化Spring程序的开发。所以在整合任意技术的时候,如果你想直观感触到简化的效果,你必须先知道使用…

SpringBoot项目创建和使用

Idea创建(社区版) 安装插件 首先找到设置,然后点击插件,在里面搜索 springboot helper 安装好后名字和图标会变为如下: 安装好后就可以开始创建项目了。 创建项目 第一步:打开创建项目面板 上面设置源…

2.2.1服务器百万并发实现

接上节课,上节课中,我们使用了epoll实现了同时监听多个文件描述符,是对IO的管理,也提到了reactor是对事件的管理,那具体来说是怎样的呢?reactor是事件驱动模型,也就是EPOLLIN/EPOLLOUT&#xff…

arm64 页表以及映射分析

arm64 页表映射分析 1 linux 6.10 xilinx内核的内存配置2 arm64不同粒度页的页表2.1 4KB页面粒度的页表配置2.2 16KB页面粒度的页表配置2.3 64KB页面粒度的页表配置 3 页表描述符3.1 无效页表描述符3.2 L0~L2页表描述符3.3 L3页表描述符 4 linux arm64 页表映射4.1 __create_pg…

Java 字符串类型的JSON数组转List<Object>

1.依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.21</version></dependency> 2.代码 import cn.hutool.json.JSONUtil; import java.util.List;/*** 字符串类型的JSON数组…

Java 把 Map 的值(Value)转换为 Array, List 或 Set

概述 在这篇短文中&#xff0c;我们将会展示如何把 Map 中的值取出来&#xff0c;转换为一个 Array,、List 或者一个 Set。 当然&#xff0c;你可以使用 Java JDK 来进行转换&#xff0c;你也可以使用 Guava 来进行转换。 首先&#xff0c;让我们来看看&#xff0c;如何使用原…

理解和实现简单的XOR神经网络

本文介绍了神经网络的基本知识&#xff0c;并以实现一个简单的XOR神经网络为例&#xff0c;详细解释了神经网络的工作原理和关键概念。我们将利用Python编写的代码来逐步理解并实现这个神经网络。 神经网络是一种模仿生物神经系统的计算模型&#xff0c;用于处理复杂的输入数据…

生产上的一次慢查询SQL优化

一、背景 MySQL版本5.6.16&#xff0c;InnoDB 生产上有个业务场景&#xff0c;需要每日拉取还款计划表里某些产品编号的所有状态为0&#xff0c;1数据的借据号和产品编号&#xff0c;SQL如下 select distinctloan_no,product_codefrom repay_plan<where>status in (0,1…

银行数字化转型导师坚鹏:银行业务数字化创新工作坊(简版)

银行业务数字化创新工作坊&#xff08;简版&#xff09; 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚如何进行业务数字化创新&#xff1f; 不知道如何开展银行数字化营销工作&#xff1f; 不知道零售业务数字化创新成功案例&#xff1f; 学员收获&a…

Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例

目录 Filter 过滤器 Filter 过滤器说明 过滤器介绍 4. 应用场景 Filter 过滤器基本原理 代码示例 login.jsp LoginCLServlet.java admin.jsp ManageFilter.java xml配置 Filter 过滤器 url-pattern Filter 过滤器生命周期 ● Filter 生命周期图 FilterConfig ●…

RabbitMQ-后台使用

1、首先本地启动rabbitMQ,登录网址 http://localhost:15672/ 默认账号与密码都是gust 2、使用 user:创建用户 virtual-host:创建某个项目单独使用一个单独host和用户 3、命令添加用户与授权 添加用户 rabbitmqctl add_user admin admin 设置permissions rabbitmqctl set_…

Oracle系列之九:一文搞懂Oracle常用函数

Oracle常用系统函数 1. 字符串函数2. 数学函数3. 日期函数4. 聚合函数5. 其他 Oracle是一种关系型数据库管理系统&#xff0c;它提供了许多内置函数&#xff0c;以便用户可以更轻松地处理数据。 1. 字符串函数 &#xff08;1&#xff09;lengthb/length 计算字符串长度 len…