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 相关文章推荐
对google个性主页的拖拽效果的js的完整注释[转]
Apr 10 Javascript
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
Apr 24 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 Javascript
微信小程序  wx.request合法域名配置详解
Nov 23 Javascript
8 行 Node.js 代码实现代理服务器
Dec 05 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
Vue 项目部署到服务器的问题解决方法
Dec 05 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
May 17 Javascript
React优化子组件render的使用
May 12 Javascript
微信头像地址失效踩坑记附带解决方案
Sep 23 Javascript
ES2020 新特性(种草)
Jan 12 Javascript
gojs实现蚂蚁线动画效果
Feb 18 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注释实例技巧
2008/10/03 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
python pdb调试方法分享
2014/01/21 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
测绘工程个人的自我评价
2013/11/23 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
先进事迹报告会感言
2014/01/24 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
毕业生工作求职信
2014/06/30 职场文书
六查六看六改心得体会
2014/10/14 职场文书
婚礼答谢词
2015/01/04 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
工作简报范文
2015/07/21 职场文书