ES7 and ES8 新功能

可选链运算符

  • 使用可选链运算符,只需要使用 ?. 来访问嵌套对象。
  • 而且如果碰到的是 undefined 或 null 属性,那么它只会返回 undefined
const opt = {
  obj1: {
    obj2: {
      obj3: {
        obj4: {
          obj5: 5
        }
      }
    }
  }
}
console.log(opt?.obj1?.obj2?.obj3?.obj4?.obj5);

当我们的程序执行到 undefined 或 null 属性时,不会崩溃,而只是返回 undefined。不幸的是,这尚未在任何浏览器中实现,所以最新版本的 Babel 来使用此功能。

let nestedProp = obj && obj.first && obj.first.second;

在访问obj.first.second之前,obj和obj.first 的值要被确认非null(且不是undefined)。目的是为了防止错误发生,如果简单直接的访问obj.first.second而不对obj和obj.first 进行校验就有可能产生错误。

let nestedProp = obj?.first?.second;

如果obj或obj.first是null/undefined,表达式将会短路计算直接返回undefined。 

空位合并运算符

我们在开发过程中,经常会遇到这样场景:变量如果是空值,则就使用默认值,我们是这样实现的:

let c = a ? a : b // 方式1
let c = a || b // 方式2

来自 undefined 或 null 值的另一个问题是,如果我们想要的变量为 undefined 或 null 则必须给变量设置默认值。

const y = x || 500;

当使用 || 运算符将 x 设置为 y 时,如果 x 被定义为 undefined,我们必须设置一个默认值。

运算符 || 的问题在于,所有类似于 (0, '', false)之类的值都将被我们不想要的默认值覆盖。

为了解决这个问题,有人提议创建一个“nullish”合并运算符,用 ?? 表示。有了它,我们仅在第一项为 null 或 undefined 时设置默认值。

const y = x ?? 500;
const x = null;
const y = x ?? 500;
console.log(y); // 500
const n = 0
const m = n ?? 9000;
console.log(m) // 0

y 将被分配的值为 500,因为 x 的值为 null

但是,由于 n 不为 null 或 unfined,因此 m 被赋予值为 0

如果我们使用 || 而不是 ??,那么由于 0 为假,因此将为 m 赋值 9000。

let c = a ?? b;
// 等价于let c = a !== undefined && a !== null ? a : b;

此功能尚未在任何浏览器或 Node.js 中实现,我们必须使用最新版本的 Babel 才能使用此功能。

 

Array.prototype.includes

Array.prototype.includes用法都容易和简单。它是一个替代indexOf,开发人员用来检查数组中是否存在值,indexOf是一种尴尬的使用,因为它返回一个元素在数组中的位置或者-1当这样的元素不能被找到的情况下。所以它返回一个数字,而不是一个布尔值。开发人员需要实施额外的检查。在ES6,要检查是否存在值你需要做一些如下图所示小技巧,因为他们没有匹配到值,Array.prototype.indexOf返回-1变成了true(转换成true),但是当匹配的元素为0位置时候,该数组包含元素,却变成了false。

console.log([1, 2, 3].includes(2)) // === true)
console.log([1, 2, 3].includes(4)) // === false)
console.log([1, 2, NaN].includes(NaN)) // === true)
console.log([1, 2, -0].includes(+0)) // === true)
console.log([1, 2, +0].includes(-0)) // === true)
console.log(['a', 'b', 'c'].includes('a')) // === true)
console.log(['a', 'b', 'c'].includes('a', 1)) // === false)

参考:Javascript之ES7详解javaScript中ES6 ES7、ES8、ES9、ES10实用的新特性ES7 and ES8 特性Numeral介绍 - 格式化和操作数字的 JavaScript 库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值