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 相关文章推荐
用javascript实现的图片马赛克后显示并切换加文字功能
Apr 21 Javascript
将光标定位于输入框最右侧实现代码
Dec 04 Javascript
在Node.js应用中读写Redis数据库的简单方法
Jun 30 Javascript
jQuery.deferred对象使用详解
Mar 18 Javascript
JS实现中国公民身份证号码有效性验证
Feb 20 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
May 03 Javascript
EasyUI中的dataGrid的行内编辑
Jun 22 Javascript
Javascript中Promise的四种常用方法总结
Jul 14 Javascript
vue.js框架实现表单排序和分页效果
Aug 09 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 Javascript
150行代码带你实现微信小程序中的数据侦听
May 17 Javascript
Vue 3.0中jsx语法的使用
Nov 13 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定时执行任务实现方法详解(Timer)
2015/07/30 PHP
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
2013/01/22 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python入门教程之识别验证码
2017/03/04 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
python 处理string到hex脚本的方法
2018/10/26 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
python中eval与int的区别浅析
2019/08/11 Python
django实现用户注册实例讲解
2019/10/30 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
MySQL面试题目集锦
2016/04/14 面试题
2014年小学语文工作总结
2014/12/20 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
基于python实现银行管理系统
2021/04/20 Python
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
Pandas 稀疏数据结构的实现
2021/07/25 Python
Python制作动态字符画的源码
2021/08/04 Python
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers