ECMAScript 6 下一代 JavaScript 标准

发布于 2021-11-08 12:57:11 字数 4748 浏览 1342 评论 0

介绍

ECMAScript6 是下一代 JavaScript 标准,这个标准将在2015年6月得到批准。ES6 是 JavaScript 的一个重大的更新,并且是自2009年发布ES5以来的第一次更新。 它将会在主要的 JavaScript 引擎实现以下新的特性。

Arrows(箭头函数)

ES6 允许使用“箭头”(=>)定义函数。在语法上类似于C#、Java8和CoffeeScript的相关特性。它们同时支持表达式和语句体,和函数不同的是, 箭头在上下文中共享相同的this关键字。

// 表达式
var odds = evens.map(v => v + 1);
var nums = evens.map((v, i) => v + i);

// 语句体
nums.forEach(v => {
  if (v % 5 === 0)
    fives.push(v);
});

// this关键字
var bob = {
  _name: "Bob",
  _friends: [],
  printFriends() {
    this._friends.forEach(f =>
      console.log(this._name + " knows " + f));
  }
}

Classe 结构

相对于目前使用的基于原型的面向对象模式而言,ES6中的class做法是一个简单的语法糖。它有一个方便的申明模式,并且鼓励互操作性。 class支持基于原型的继承、super调用、实例和静态方法和构造函数。

class SkinnedMesh extends THREE.Mesh {
  //构造函数
  constructor(geometry, materials) {
    super(geometry, materials);

    this.idMatrix = SkinnedMesh.defaultMatrix();
    this.bones = [];
    this.boneMatrices = [];
    //...
  }
  update(camera) {
    //...
    super.update();
  }
  //静态方法
  static defaultMatrix() {
    return new THREE.Matrix4();
  }
}

在上面的代码中,ES6使用constructor方法代替ES5的构造函数。

增强的 Object 对象

Object 对象的增强ES6允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。

var obj = {
    // __proto__
    __proto__: theProtoObj,
    // 对 ‘handler: handler’ 的简化版
    handler,
    // 方法
    toString() {
     // Super calls
     return "d " + super.toString();
    },
    // 计算(动态)属性名称
    [ 'prop_' + (() => 42)() ]: 42
};

模板字符串

模板字符串提供构造字符串的语法糖,这种用法类似perl,python中的插值特征功能。 可选地,可以添加一个标签允许自定义字符串建设,避免注入攻击或从字符串构造更高层次数据结构的内容。

// 基本的字符串创建
`In JavaScript '\n' is a line-feed.`

// 多行字符串
`In JavaScript this is
 not legal.`

// 构建DOM查询
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`

GET`http://foo.org/bar?a=${a}&b=${b}

X-Credentials: ${credentials}
    { "foo": ${foo},
      "bar": ${bar}}`(myOnReadyStateChangeHandler);

Let 和 Const 操作符

ES6 新增了 let 命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。

function f() {
  {
    let x;
    {
      // okay, block scoped name
      const x = "sneaky";
      // error, const
      x = "foo";
    }
    // error, already declared in block
    let x = "inner";
  }
}

For...of 循环

JavaScript 原有的for...in循环,只能获得对象的键名,不能直接获取键值。ES6提供for...of循环,允许遍历获得键值

let fibonacci = {
  [Symbol.iterator]() {
    let pre = 0, cur = 1;
    return {
      next() {
        [pre, cur] = [cur, pre + cur];
        return { done: false, value: cur }
      }
    }
  }
}

for (var n of fibonacci) {
  // truncate the sequence at 1000
  if (n > 1000)
    break;
  print(n);
}

Generators

ES6 草案定义的 generator 函数,需要在 function 关键字后面,加一个星号。然后,函数内部使用yield语句,定义遍历器的每个成员。

yield 有点类似于 return 语句,都能返回一个值。区别在于每次遇到yield,函数返回紧跟在yield后面的那个表达式的值,然后暂停执行,下一次从该位置继续向后执行,而return语句不具备位置记忆的功能。

var fibonacci = {
  [Symbol.iterator]: function*() {
    var pre = 0, cur = 1;
    for (;;) {
      var temp = pre;
      pre = cur;
      cur += temp;
      yield cur;
    }
  }
}

for (var n of fibonacci) {
  // truncate the sequence at 1000
  if (n > 1000)
    break;
  print(n);
}

Modules 模块

基本用法

ES6允许定义模块。也就是说,允许一个JavaScript脚本文件调用另一个脚本文件。

假设有一个circle.js,它是一个单独模块。

  // circle.js

  export function area(radius) {
    return Math.PI * radius * radius;
  }

  export function circumference(radius) {
    return 2 * Math.PI * radius;
  }

然后,main.js引用这个模块。

  // main.js

  import { area, circumference } from 'circle';

  console.log("圆面积:" + area(4));
  console.log("圆周长:" + circumference(14));

另一种写法是整体加载circle.js。

  // main.js

  module circle from 'circle';

  console.log("圆面积:" + circle.area(4));
  console.log("圆周长:" + circle.circumference(14));

模块的继承

一个模块也可以继承另一个模块。

  // circleplus.js

  export * from 'circle';
  export var e = 2.71828182846;
  export default function(x) {
      return Math.exp(x);
  }

加载上面的模块。

  // main.js

  module math from "circleplus";
  import exp from "circleplus";
  console.log(exp(math.pi);

模块的默认方法

还可以为模块定义默认方法。

  // circleplus.js

  export default function(x) {
      return Math.exp(x);
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

成熟的代价

暂无简介

0 文章
0 评论
375 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文