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 居中漂浮广告
Mar 21 Javascript
js实现适配不同的屏幕大小
Apr 10 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
Apr 13 Javascript
JS实现加载和读取XML文件的方法详解
Apr 24 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
May 24 Javascript
关于预加载InstantClick的问题解决方法
Sep 12 Javascript
vue用addRoutes实现动态路由的示例
Sep 15 Javascript
基于js中的原型(全面讲解)
Sep 19 Javascript
js删除数组中的元素delete和splice的区别详解
Feb 03 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 Javascript
js实现无缝轮播图特效
May 09 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
Aug 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读取MySQL数据代码
2008/06/05 PHP
用PHP的ob_start() 控制您的浏览器cache
2009/08/03 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
Django如何配置mysql数据库
2018/05/04 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
Python元组知识点总结
2019/02/18 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
win10安装python3.6的常见问题
2020/07/01 Python
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
项目副经理岗位职责
2013/12/30 职场文书
校庆团日活动总结
2014/08/28 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
python 详解turtle画爱心代码
2022/02/15 Python
SQL Server中锁的用法
2022/05/20 SQL Server