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 相关文章推荐
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
js实现拖拽效果
Feb 12 Javascript
使用AngularJS创建自定义的过滤器的方法
Jun 18 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
原生javascript实现的一个简单动画效果
Mar 30 Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 Javascript
jQuery实现微信长按识别二维码功能
Aug 26 Javascript
angularjs实现搜索的关键字在正文中高亮出来
Jun 13 Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 Javascript
全面介绍vue 全家桶和项目实例
Dec 27 Javascript
JS实现读取xml内容并输出到div中的方法示例
Apr 19 Javascript
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
字节飞书面试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
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
js获取本机的外网/广域网ip地址完整源码
2013/08/12 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
python leetcode 字符串相乘实例详解
2018/09/03 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
Python 学习教程之networkx
2019/04/15 Python
Python imread、newaxis用法详解
2019/11/04 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
python str字符串转uuid实例
2020/03/03 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
Django静态文件加载失败解决方案
2020/08/26 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
逃课检讨书
2015/01/26 职场文书
教师工作表现自我评价
2015/03/05 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers