ホームページ  >  記事  >  ウェブフロントエンド  >  JS--ES 2015/6 の新機能の概要

JS--ES 2015/6 の新機能の概要

怪我咯
怪我咯オリジナル
2017-06-26 12:01:29984ブラウズ

ES 2015/6 には、非常に多くの新しいコンテンツがあります。ここでは、これらの機能の概要のみを示します (必ずしも包括的ではありません)。実際、この記事はそれを要約することを目的としており、これらの特性についての詳細な議論や調査は行いません。そして、時間があれば、何回かに分けてブログを書いて、よく使われるポイントを掘り下げて、皆さんと深く交流していきたいと思います。

アロー関数

アロー関数は、=> 構文で実装される関数の短い形式で、C#/JAVA8/CoffeeScript でも同様の構文を持ちます。関数とは異なり、アロー関数は同じ this を実行コンテキストと共有します。アロー関数が関数オブジェクト内にある場合、その関数と arguments 変数を共有します。 => 语法实现的函数简写形式,C#/JAVA8/CoffeeScript 中都有类似语法。与函数不同,箭头函数与其执行下文环境共享同一个 this。如果一个箭头函数出现在一个函数对象内部,它会与这个函数共享 arguments 变量。


// Expression bodiesvar odds = evens.map(v => v + 1);var nums = evens.map((v, i) => v + i);// Statement bodiesnums.forEach(v => {
  if (v % 5 === 0)    fives.push(v);});// Lexical thisvar bob = {
  _name: "Bob",
  _friends: ['jim'],
  printFriends() {
    this._friends.forEach(f =>
      console.log(this._name + " knows " + f)); // Bob knows jim
  }};// Lexical argumentsfunction square() {
  let example = () => {
    let numbers = [];
    for (let number of arguments) {
      numbers.push(number * number);
    }

    return numbers;
  };

  return example();}square(2, 4, 7.5, 8, 11.5, 21); // returns: [4, 16, 56.25, 64, 132.25, 441]


类 Class

Javascript 并不是引入了一个新的面向对象的对象继承模型,而是基于原型继承的语法糖。其提供了一个更简单和清晰的语法来创建对象并处理继承。


class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }}


类没有声明提升,必须确保在调用前已经进行了声明。

构造函数 constructor 是一个特殊的方法,其用于创建和初始化类的实例。

静态方法 static 关键字用于声明静态方法

创建子类 extends 关键字用于创建子类,这里要注意:extends 不能用于扩展常规对象(不可构造/非构造的),如果要继承常规对象,可使用 Object.setPrototypeOf()

调用超类 super 关键字可以用来调用父类中的方法

Mix-ins 混合

增强的对象字面量

通过字面量形式可以实现,定义prototype、键值对简写、定义方法等、动态属性名称。


var obj = {
    // Sets the prototype. "__proto__" or '__proto__' would also work.
    __proto__: theProtoObj,
    // Computed property name does not set prototype or trigger early error for
    // duplicate __proto__ properties.
    ['__proto__']: somethingElse,
    // Shorthand for ‘handler: handler’
    handler,
    // Methods
    toString() {
     // Super calls
     return "d " + super.toString();
    },
    // Computed (dynamic) property names
    [ "prop_" + (() => 42)() ]: 42};


模板字符串

模板字符串 提供构造字符串的语法糖,在 Prel/python 等语言中也都有类似特性。


// Basic literal string creation
`This is a pretty little template string.`

// Multiline strings
`In ES5 this is
 not legal.`

// Interpolate variable bindings
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`

// Unescaped template strings
String.raw`In ES5 "\n" is a line-feed.`

// Construct an HTTP request prefix is used to interpret the replacements and construction
GET`http://foo.org/bar?a=${a}&b=${b}
    Content-Type: application/json
    X-Credentials: ${credentials}
    { "foo": ${foo},
      "bar": ${bar}}`(myOnReadyStateChangeHandler);

解构赋值

Destructuring 法是一个Javascript表达式,这使得可以将值从数组或属性从对象提取到不同的变量中。

// list matching
var [a, ,b] = [1,2,3];
a === 1;
b === 3;

// object matching (用新变量名赋值)
var { op: a, lhs: { op: b }, rhs: c }
       = getASTNode()

// object matching shorthand
// binds `op`, `lhs` and `rhs` in scope
var {op, lhs, rhs} = getASTNode()

// Can be used in parameter position
function g({name: x}) {
  console.log(x);
}
g({name: 5})

// Fail-soft destructuring
var [a] = [];
a === undefined;

// Fail-soft destructuring with defaults
var [a = 1] = [];
a === 1;

// 变量可以先赋予默认值。当要提取的对象没有对应的属性,变量就被赋予默认值。
var {a = 10, b = 5} = {a: 3};
console.log(a); // 3
console.log(b); // 5

// Destructuring + defaults arguments
function r({x, y, w = 10, h = 10}) {
  return x + y + w + h;
}
r({x:1, y:2}) === 23

// 对象属性计算名和解构
let key = "z";
let { [key]: foo } = { z: "bar" };

console.log(foo); // "bar"

Default + Rest + Spread

为函数参数提供默认值 & ... 定数量参数

function f(x, y=12) {
  // y is 12 if not passed (or passed as undefined)
  return x + y;
}
f(3) == 15


function f(x, ...y) {
  // y is an Array
  return x * y.length;
}
f(3, "hello", true) == 6



function f(x, y, z) {
  return x + y + z;
}
// Pass each elem of array as argument
f(...[1,2,3]) == 6

Let + Const

let 用于声明块级作用域变量。 const

function f() {
  {
    let x;
    {
      // this is ok since it's a block scoped name
      const x = "sneaky";
      // error, was just defined with `const` above
      x = "foo";
    }
    // this is ok since it was declared with `let`
    x = "bar";
    // error, already declared above in this block
    let x = "inner";
  }
}

Class Class

Javascript Class は、新しいオブジェクト指向のオブジェクト継承モデルを導入していませんが、プロトタイプ継承の構文に基づいています。砂糖。これにより、オブジェクトの作成と継承の処理のための、より単純かつ明確な構文が提供されます。

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;
  console.log(n);
}

このクラスは昇格を宣言していません。呼び出す前に宣言されていることを確認する必要があります。

Constructor <code>constructor</code> は、クラスのインスタンスを作成および初期化するために使用される特別なメソッドです。 🎜🎜静的メソッド <code>static</code> キーワードは静的メソッドの宣言に使用されます 🎜🎜サブクラスの作成 <code>extends</code> キーワードはサブクラスの作成に使用されます。ここで注意してください: extends は通常のオブジェクトの拡張には使用できません(非構築可能/非構築可能)、通常のオブジェクトから継承したい場合は、<code>Object.setPrototypeOf()</code> を使用できます。 🎜🎜スーパークラスの呼び出し <code>super</code> キーワードを使用して、親クラスのメソッドを呼び出すことができます 🎜🎜<code>Mix-ins</code> をミックスします 🎜🎜拡張オブジェクトリテラル 🎜🎜リテラル形式を通じて行うことができますプロトタイプ、キーと値のペアの省略形、メソッドなどの定義、および動的属性名を定義することによって実装されます。 🎜<p class="sourceCode">🎜🎜<pre class="brush:js;toolbar:false;">function* quips(name) {
  yield "你好 " + name + "!";
  yield "希望你能喜欢这篇介绍ES6的译文";
  if (name.startsWith("X")) {
    yield "你的名字 " + name + "  首字母是X,这很酷!";
  }
  yield "我们下次再见!";
}
🎜🎜🎜🎜テンプレート文字列🎜🎜テンプレート文字列は、文字列を構築するための糖衣構文を提供し、Prel/Python などの言語にも同様の機能があります。 🎜

🎜🎜rrreee🎜代入の分割🎜🎜 Destructuring メソッドは Javascript 式で、これを使用すると、配列から値を抽出したり、オブジェクトのプロパティを別の変数に抽出したりすることができます。 🎜rrreee🎜Default + Rest + Spread🎜🎜関数パラメータのデフォルト値と ... の固定数のパラメータを提供します🎜rrreee🎜Let + Const🎜🎜let は宣言ブロックのレベルスコープ変数に使用されます。 const は定数を宣言するために使用されます。 🎜rrreee🎜Iterator🎜🎜 カスタム反復子を作成するには、symbol.iterator を使用します。 🎜rrreee🎜🎜🎜🎜ジェネレーター🎜🎜通常の関数は関数宣言を使用しますが、ジェネレーター関数は function* 宣言を使用します。 🎜🎜ジェネレーター関数内には、return に似た構文、キーワード yield があります。 2 つの違いは、通常の関数は 1 回しか返せないのに対し、ジェネレーター関数は複数回返せることです (もちろん、1 回だけ返すこともできます)。ジェネレーターの実行中、yield 式に遭遇するとすぐに一時停止され、後で実行状態を再開できます。 🎜rrreee🎜Unicode🎜🎜// ES5.1と同じ 」

以上がJS--ES 2015/6 の新機能の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。