ES6 (二十九)ES6最新提案、do、throw、函数部分执行、管道运算符|>、柯里化、::、Realm API

本文深入探讨了ES6的最新提案,包括do表达式用于返回块级作用域的值,throw表达式允许在表达式中抛出错误,函数部分执行简化参数绑定,以及管道运算符改善函数链式调用。此外,还介绍了Math.signbit()、双冒号运算符、Realm API、import.meta元信息以及JSON模块导入等功能,帮助提升JavaScript编程效率和代码可读性。
摘要由CSDN通过智能技术生成

ES6 (二十九)ES6最新提案、do、throw、函数部分执行、管道运算符|>、柯里化、::、Realm API

1. do 表达式

本质上,块级作用域是一个语句,将多个操作封装在一起,没有返回值。

{
   
  let t = f();
  t = t * t + 1;
}

上面代码中,块级作用域将两个语句封装在一起。但是,在块级作用域以外,没有办法得到t的值,因为块级作用域不返回值,除非t是全局变量。

现在有一个提案,使得块级作用域可以变为表达式,也就是说可以返回值,办法就是在块级作用域之前加上do,使它变为do表达式,然后就会返回内部最后执行的表达式的值。

let x = do {
   
  let t = f();
  t * t + 1;
};

上面代码中,变量x会得到整个块级作用域的返回值(t * t + 1)。

do表达式的逻辑非常简单:封装的是什么,就会返回什么。

// 等同于 <表达式>
do {
    <表达式>; }

// 等同于 <语句>
do {
    <语句> }

do表达式的好处是可以封装多个语句,让程序更加模块化,就像乐高积木那样一块块拼装起来。

let x = do {
   
  if (foo()) {
    f() }
  else if (bar()) {
    g() }
  else {
    h() }
};

上面代码的本质,就是根据函数foo的执行结果,调用不同的函数,将返回结果赋给变量x。使用do表达式,就将这个操作的意图表达得非常简洁清晰。而且,do块级作用域提供了单独的作用域,内部操作可以与全局作用域隔绝。

值得一提的是,do表达式在 JSX 语法中非常好用。

return (
  <nav>
    <Home />
    {
   
      do {
   
        if (loggedIn) {
   
          <LogoutButton />
        } else {
   
          <LoginButton />
        }
      }
    }
  </nav>
)

上面代码中,如果不用do表达式,就只能用三元判断运算符(?:)。那样的话,一旦判断逻辑复杂,代码就会变得很不易读。

2. throw 表达式

JavaScript 语法规定throw是一个命令,用来抛出错误,不能用于表达式之中。

// 报错
console.log(throw new Error());

上面代码中,console.log的参数必须是一个表达式,如果是一个throw语句就会报错。

现在有一个提案,允许throw用于表达式。

// 参数的默认值
function save(filename = throw new TypeError("Argument required")) {
   
}

// 箭头函数的返回值
lint(ast, {
   
  with: () => throw new Error("avoid using 'with' statements.")
});

// 条件表达式
function getEncoder(encoding) {
   
  const encoder = encoding === "utf8" ?
    new UTF8Encoder() :
    encoding === "utf16le" ?
      new UTF16Encoder(false) :
      encoding === "utf16be" ?
        new UTF16Encoder(true) :
        throw new Error("Unsupported encoding");
}

// 逻辑表达式
class Product {
   
  get id() {
   
    return this._id;
  }
  set id(value) {
   
    this._id = value || throw new Error("Invalid value");
  }
}

上面代码中,throw都出现在表达式里面。

语法上,throw表达式里面的throw不再是一个命令,而是一个运算符。为了避免与throw命令混淆,规定throw出现在行首,一律解释为throw语句,而不是throw表达式。

3. 函数的部分执行

语法

多参数的函数有时需要绑定其中的一个或多个参数,然后返回一个新函数。

function add(x, y) {
    return x + y; }
function add7(x) {
    return x + 7; }

上面代码中,add7

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChrisP3616

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值