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实现页面实时显示当前时间的简单实例
Jul 20 Javascript
JavaScript学习笔记之数组的增、删、改、查
Mar 23 Javascript
Easyui 之 Treegrid 笔记
Apr 29 Javascript
Node.js连接MongoDB数据库产生的问题
Feb 08 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
Apr 11 jQuery
实例解析Vue.js下载方式及基本概念
May 11 Javascript
vue.js 实现点击展开收起动画效果
Jul 07 Javascript
浅谈Angular7 项目开发总结
Dec 19 Javascript
Vue实现的父组件向子组件传值功能示例
Jan 19 Javascript
Vue 实现从文件中获取文本信息的方法详解
Oct 16 Javascript
javascript如何实现create方法
Nov 04 Javascript
详解关于Vue单元测试的几个坑
Apr 26 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 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
Javascript学习笔记2 函数
2010/01/11 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
javascript实现连续赋值
2015/08/10 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
Python绑定方法与非绑定方法详解
2017/08/18 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
python属于解释语言吗
2020/06/11 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
Python下载的11种姿势(小结)
2020/11/18 Python
详解Python中的Lock和Rlock
2021/01/26 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
奥地利网上书店:Weltbild
2017/07/14 全球购物
Java基础面试题
2014/07/19 面试题
统计员岗位职责
2013/11/14 职场文书
高中生学习的自我评价
2013/12/14 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
安徽导游词
2015/02/12 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android