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 相关文章推荐
JS getMonth()日期函数的值域是0-11
Feb 15 Javascript
查看图片(前进后退)功能实现js代码
Apr 24 Javascript
js实现跨域的4种实用方法原理分析
Oct 29 Javascript
TypeScript Type Innference(类型判断)
Mar 10 Javascript
JQuery遍历元素的父辈和祖先的方法
Sep 18 Javascript
jQuery继承extend用法详解
Oct 10 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
Jul 20 Javascript
zTree节点文字过多的处理方法
Nov 24 Javascript
vue awesome swiper异步加载数据出现的bug问题
Jul 03 Javascript
微信小程序提交form操作示例
Dec 30 Javascript
JS异步执行结果获取的3种解决方式
Feb 19 Javascript
开发中常用的25个JavaScript单行代码(小结)
Jun 28 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/06/20 PHP
PHP实现单例模式最安全的做法
2014/06/13 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
javascript 简练的几个函数
2009/08/29 Javascript
jquery 经典动画菜单效果代码
2010/01/26 Javascript
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
关于this和self的使用说明
2010/08/01 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
django输出html内容的实例
2018/05/27 Python
Python子类继承父类构造函数详解
2019/02/19 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
Python Django 简单分页的实现代码解析
2019/08/21 Python
Django-imagekit的使用详解
2020/07/06 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
世界第一冲浪品牌:O’Neill
2016/08/30 全球购物
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
给老师的保证书怎么写
2015/05/09 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技
Python 中面向接口编程
2022/05/20 Python