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 isPrototypeOf和hasOwnProperty使用区别
Mar 04 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
Jan 04 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
Apr 16 Javascript
jquery滚动条插件jScrollPane的使用介绍
Nov 08 Javascript
jquery基础教程之deferred对象使用方法
Jan 22 Javascript
深入理解JS中的变量及作用域、undefined与null
Mar 04 Javascript
js实现从中间开始往上下展开网页窗口的方法
Mar 02 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 Javascript
JS选取DOM元素的简单方法
Jul 08 Javascript
VUE使用vuex解决模块间传值问题的方法
Jun 01 Javascript
Node.js中package.json中库的版本号(~和^)
Apr 02 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
Nov 09 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开启gzip页面压缩实例代码
2010/03/11 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
python绘制条形图方法代码详解
2017/12/19 Python
Django csrf 验证问题的实现
2018/10/09 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
信用社员工先进事迹材料
2014/02/04 职场文书
粗加工管理制度
2014/02/04 职场文书
公司员工检讨书
2014/02/08 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
2014个人年度工作总结
2014/12/15 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
标枪加油稿
2015/07/22 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA