5个实用的JavaScript新特性


Posted in Javascript onJune 16, 2022

前言

JavaScript在不断地升级迭代,越来越多的新特性让我们的代码写起来变得简洁有趣,这篇文章会介绍5个新特性,一起研究一下把。

1.# 使用"Object.hasOwn"替代“in”操作符

有时,我们想知道对象上是否存在某个属性,一般会使用“in”操作符或“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  注意这里

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  注意这里

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  
let object3 = Object.create(null)
Object.hasOwn(object3, 'age') // false

2.# 使用"#"声明私有属性

以前,我们一般用_表示私有属性,但它并不靠谱,还是会被外部修改。

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 // 依旧可以从外部修改_money属性,所以这种做法并不安全
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 // 没法从外部直接修改
p1.money = 2
console.log(p1.money) // 2
console.log(p1.#money) // Uncaught SyntaxError: Private field '#money' must be declared in an enclosing class

3.# 超有用的"数字分隔符"

直接看例子,惊呆了我...

const sixBillion = 6000000000
// ❌ 难以阅读
const sixBillion2 = 6000_000_000
// ✅ 更加易于阅读
console.log(sixBillion2) // 6000000000

当然也可以使用"_"用于计算

const sum = 1000 + 6000_000_000 // 6000001000

4.# 使用"?."简化"&&"和三元运算符

这些例子,你一定非常熟悉,咱们有办法可以简化它吗?

const obj = null
console.log(obj && obj.name)
const $title = document.querySelector('.title')
const title = $title ? title.innerText : undefined

“?.”

const obj = null
console.log(obj?.name)
const $title = document.querySelector('.title')
const title = $title?.innerText

Tips

?. 的一般用法

  • obj?.prop 对象属性
  • obj?.[expr] 对象属性
  • func?.(...args) 执行函数

5.# 使用"BigInt"支持大数计算

JS中超过“Number.MAX_SAFE_INTEGER”的数字计算将是不安全的。

Example:

Math.pow(2, 53) === Math.pow(2, 53) + 1 // true
// Math.pow(2, 53) => 9007199254740992
// Math.pow(2, 53) + 1 => 9007199254740992

使用"BigInt"完全可以避免这个问题

BigInt(Math.pow(2, 53)) === BigInt(Math.pow(2, 53)) + BigInt(1) // false

最后

希望能一直给大家分享实用、基础、进阶的知识点,一起早早下班,快乐摸鱼,更多关于JavaScript新特性的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jQuery学习笔记 更改jQuery对象
Sep 19 Javascript
js二级地域选择的实现方法
Jun 17 Javascript
批量实现面向对象的实例代码
Jul 01 Javascript
常用的JavaScript验证正则表达式汇总
Nov 26 Javascript
JavaScript数组Array对象增加和删除元素方法总结
Jan 20 Javascript
jquery制作多功能轮播图插件
Apr 02 Javascript
用file标签实现多图文件上传预览
Feb 14 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
Feb 26 Javascript
Postman模拟发送带token的请求方法
Mar 31 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
Jul 24 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
May 29 Javascript
javascript的delete运算符知识点总结
Nov 19 Javascript
字节飞书面试promise.all实现示例
Jun 16 #Javascript
JS轻量级函数式编程实现XDM三
Jun 16 #Javascript
JS轻量级函数式编程实现XDM二
Jun 16 #Javascript
JS函数式编程实现XDM一
Jun 16 #Javascript
正则表达式基础与常用验证表达式
Jun 16 #Javascript
使用compose函数优化代码提高可读性及扩展性
html中两种获取标签内的值的方法
Jun 16 #jQuery
You might like
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
租赁意向书范本
2014/04/01 职场文书
体育专业自荐书
2014/05/29 职场文书
中学生逃课检讨书
2015/02/17 职场文书
个人年终总结范文
2015/03/09 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
2016党员入党决心书
2015/09/22 职场文书
MySQL 查询速度慢的原因
2021/05/25 MySQL
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技