es6 は何から来たのですか?

青灯夜游
青灯夜游オリジナル
2022-04-11 13:54:163708ブラウズ

es6 は 2015 年 6 月にリリースされました。 es6 の正式名称は「ECMAScript6」です。2015 年 6 月に正式にリリースされた JavaScript 言語標準です。正式には ECMAScript2015 (ES2015) と呼ばれます。ECMAScript の 6 番目のバージョンであるため、es6 と呼ぶことができます。

es6 は何から来たのですか?

このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。

「es」の概要

es の正式名は「ECMAScript」で、ECMA-262 標準に従って実装されたユニバーサル スクリプト言語です。 , ECMA-262 標準 主に言語の構文、型、ステートメント、キーワード、予約語、演算子、オブジェクト、その他の部分について規定しています。ECMAScript の現在の最新バージョンは ECMAScript6 (「ES6」と呼ばれます) です。

ES の後に数字が表示される場合は、それは異なるバージョンの ECMAScript です。

es6/ ES2015

es6 は ECMAScript6 (ECMAScript の 6 番目のバージョン) の略で、2015 年 6 月に正式にリリースされた JavaScript 言語です。標準であり、正式には ECMAScript 2015 (ES2015) と呼ばれます。その目標は、JavaScript 言語を使用して複雑な大規模アプリケーションを作成できるようにし、エンタープライズ レベルの開発言語になることです。

ECMAScript 6 は基本的に業界標準になっており、その人気は ES5 よりもはるかに速いです。主な理由は、最新のブラウザ、特に Chrome ブラウザと Firefox ブラウザはすでに ES6 のほとんどの機能をサポートしているためです。

ES6 の新機能:

1. let、const、ブロック スコープ

let により、ブロック レベルのスコープを作成できます。 , ES6 では、関数内で変数を定義するには var の代わりに let を使用することをお勧めします:

var a = 2;
{
  let a = 3;
  console.log(a); // 3
}
console.log(a); // 2

ブロックレベルのスコープでも有効なもう 1 つの変数宣言方法は、定数を宣言できる const です。 ES6 では、const によって宣言された定数はポインターに似ており、参照を指します。つまり、この「定数」は不変ではないことを意味します。次のようになります:

{
  const ARR = [5,6];
  ARR.push(7);
  console.log(ARR); // [5,6,7]
  ARR = 10; // TypeError
}

注意すべき点がいくつかあります:

  • let キーワードで宣言された変数には変数ホイスティング機能はありません
  • let および const 宣言は最も近いブロック (中括弧内) でのみ有効です
  • 使用する場合定数 const を宣言するときは、次のように大文字の変数を使用してください: CAPITAL_CASING
  • const 宣言時には、

2 に値を割り当てる必要があります。 アロー関数

ES6 では、アロー関数は関数の省略形であり、かっこを使用してパラメーターをラップし、その後に => が続き、その後に関数本体が続きます:

var getPrice = function() {
  return 4.55;
};
 
// Implementation with Arrow Function
var getPrice = () => 4.55;

上記の例では、次の点に注意してください。 getPrice アロー関数は、return ステートメントを必要としない簡潔な関数本体を使用します。次の例では、通常の関数本体を使用しています:

let arr = ['apple', 'banana', 'orange'];
 
let breakfast = arr.map(fruit => {
  return fruit + 's';
});
 
console.log(breakfast); // apples bananas oranges

もちろん、アロー関数はコードを単純にするだけではありません。 function is always バインディングは常にオブジェクト自体を指します。詳細については、次の例を参照してください。

function Person() {
  this.age = 0;
 
  setInterval(function growUp() {
    // 在非严格模式下,growUp() 函数的 this 指向 window 对象
    this.age++;
  }, 1000);
}
var person = new Person();

これを保存するために変数を使用し、growUp 関数で参照する必要があることがよくあります。

function Person() {
  var self = this;
  self.age = 0;
 
  setInterval(function growUp() {
    self.age++;
  }, 1000);
}

アロー関数を使用すると保存できますこの問題:

function Person(){
  this.age = 0;
 
  setInterval(() => {
    // |this| 指向 person 对象
    this.age++;
  }, 1000);
}
 
var person = new Person();

3. 関数パラメータのデフォルト値

ES6 では、関数パラメータのデフォルト値を設定できます:

let getFinalPrice = (price, tax=0.7) => price + price * tax;
getFinalPrice(500); // 850

4. スプレッド / レスト演算子

スプレッド / レスト演算子は...を指しますが、それがスプレッドかレストかはコンテキストによって異なります。

イテレータで使用する場合、これは Spread 演算子です:

function foo(x,y,z) {
  console.log(x,y,z);
}
 
let arr = [1,2,3];
foo(...arr); // 1 2 3

関数でパラメータを渡すために使用する場合、これは Rest 演算子です:

function foo(...args) {
  console.log(args);
}
foo( 1, 2, 3, 4, 5); // [1, 2, 3, 4, 5]

5. オブジェクト語彙拡張

ES6 により、オブジェクト リテラルを宣言するときに短縮構文を使用して属性変数および関数の定義メソッドを初期化できるようになり、オブジェクト属性での計算操作が可能になります:

function getCar(make, model, value) {
  return {
    // 简写变量
    make,  // 等同于 make: make
    model, // 等同于 model: model
    value, // 等同于 value: value
 
    // 属性可以使用表达式计算值
    ['make' + make]: true,
 
    // 忽略 `function` 关键词简写对象函数
    depreciate() {
      this.value -= 2500;
    }
  };
}
 
let car = getCar('Barret', 'Lee', 40000);
 
// output: {
//     make: 'Barret',
//     model:'Lee',
//     value: 40000,
//     makeBarret: true,
//     depreciate: [Function: depreciate]
// }

6. 2 進数および 8 進数のリテラル

ES6 は、数値の前に 0o または 0O を追加することで 8 進数に変換できる、2 進数および 8 進数のリテラルをサポートしています。値:

let oValue = 0o10;
console.log(oValue); // 8
 
let bValue = 0b10; // 二进制使用 `0b` 或者 `0B`
console.log(bValue); // 2

7. オブジェクトと配列の構造化

構造化すると、オブジェクトの割り当て中の中間変数の生成を回避できます:

function foo() {
  return [1,2,3];
}
let arr = foo(); // [1,2,3]
 
let [a, b, c] = foo();
console.log(a, b, c); // 1 2 3
 
function bar() {
  return {
    x: 4,
    y: 5,
    z: 6
  };
}
let {x: x, y: y, z: z} = bar();
console.log(x, y, z); // 4 5 6

8. オブジェクトのスーパークラス

ES6 では、オブジェクトでスーパー メソッドを使用できます:

var parent = {
  foo() {
    console.log("Hello from the Parent");
  }
}
 
var child = {
  foo() {
    super.foo();
    console.log("Hello from the Child");
  }
}
 
Object.setPrototypeOf(child, parent);
child.foo(); // Hello from the Parent
             // Hello from the Child

9. テンプレート構文と区切り文字

ES6 には非常に優れた方法があります。一連の文字列と変数を組み立てます。

  • ${ ... } は、変数
  • ` を区切り文字
let user = 'Barret';
console.log(`Hi ${user}!`); // Hi Barret!

10 としてレンダリングするために使用されます。 of VS for...in

for...of は、配列などの反復子を走査するために使用されます。

let nicknames = ['di', 'boo', 'punkeye'];
nicknames.size = 3;
for (let nickname of nicknames) {
  console.log(nickname);
}
// 结果: di, boo, punkeye

for...in は、配列などの反復子を走査するために使用されます。オブジェクト内のプロパティ:

let nicknames = ['di', 'boo', 'punkeye'];
nicknames.size = 3;
for (let nickname in nicknames) {
  console.log(nickname);
}
Result: 0, 1, 2, size

11. Map と WeakMap

ES6 には、Map と WeakMap という 2 つの新しいデータ構造セットがあります。実際、すべてのオブジェクトをマップとして表示できます。

オブジェクトは複数のキーと値のペアで構成されます。Map では、次のように任意の型をオブジェクトのキーとして使用できます:

var myMap = new Map();
 
var keyString = "a string",
    keyObj = {},
    keyFunc = function () {};
 
// 设置值
myMap.set(keyString, "value 与 'a string' 关联");
myMap.set(keyObj, "value 与 keyObj 关联");
myMap.set(keyFunc, "value 与 keyFunc 关联");
 
myMap.size; // 3
 
// 获取值
myMap.get(keyString);    // "value 与 'a string' 关联"
myMap.get(keyObj);       // "value 与 keyObj 关联"
myMap.get(keyFunc);      // "value 与 keyFunc 关联"

WeakMap

WeakMap はMap ですが、そのすべてのキーは弱参照です。つまり、WeakMap 内の内容はガベージ コレクション中に考慮されないため、使用時にメモリ リークを心配する必要はありません。

另一个需要注意的点是,WeakMap 的所有 key 必须是对象。它只有四个方法 delete(key),has(key),get(key) 和set(key, val):

let w = new WeakMap();
w.set('a', 'b'); 
// Uncaught TypeError: Invalid value used as weak map key
 
var o1 = {},
    o2 = function(){},
    o3 = window;
 
w.set(o1, 37);
w.set(o2, "azerty");
w.set(o3, undefined);
 
w.get(o3); // undefined, because that is the set value
 
w.has(o1); // true
w.delete(o1);
w.has(o1); // false

12. Set 和 WeakSet

Set 对象是一组不重复的值,重复的值将被忽略,值类型可以是原始类型和引用类型:

let mySet = new Set([1, 1, 2, 2, 3, 3]);
mySet.size; // 3
mySet.has(1); // true
mySet.add('strings');
mySet.add({ a: 1, b:2 });

可以通过 forEach 和 for...of 来遍历 Set 对象:

mySet.forEach((item) => {
  console.log(item);
    // 1
    // 2
    // 3
    // 'strings'
    // Object { a: 1, b: 2 }
});
 
for (let value of mySet) {
  console.log(value);
    // 1
    // 2
    // 3
    // 'strings'
    // Object { a: 1, b: 2 }
}

Set 同样有 delete() 和 clear() 方法。

WeakSet

类似于 WeakMap,WeakSet 对象可以让你在一个集合中保存对象的弱引用,在 WeakSet 中的对象只允许出现一次:

var ws = new WeakSet();
var obj = {};
var foo = {};
 
ws.add(window);
ws.add(obj);
 
ws.has(window); // true
ws.has(foo);    // false, foo 没有添加成功
 
ws.delete(window); // 从结合中删除 window 对象
ws.has(window);    // false, window 对象已经被删除

13. 类

ES6 中有 class 语法。值得注意是,这里的 class 不是新的对象继承模型,它只是原型链的语法糖表现形式。

函数中使用 static 关键词定义构造函数的的方法和属性:

class Task {
  constructor() {
    console.log("task instantiated!");
  }
 
  showId() {
    console.log(23);
  }
 
  static loadAll() {
    console.log("Loading all tasks..");
  }
}
 
console.log(typeof Task); // function
let task = new Task(); // "task instantiated!"
task.showId(); // 23
Task.loadAll(); // "Loading all tasks.."

类中的继承和超集:

class Car {
  constructor() {
    console.log("Creating a new car");
  }
}
 
class Porsche extends Car {
  constructor() {
    super();
    console.log("Creating Porsche");
  }
}
 
let c = new Porsche();
// Creating a new car
// Creating Porsche

extends 允许一个子类继承父类,需要注意的是,子类的constructor 函数中需要执行 super() 函数。

当然,你也可以在子类方法中调用父类的方法,如super.parentMethodName()。

在 这里 阅读更多关于类的介绍。

有几点值得注意的是:

  • 类的声明不会提升(hoisting),如果你要使用某个 Class,那你必须在使用之前定义它,否则会抛出一个 ReferenceError 的错误
  • 在类中定义函数不需要使用 function 关键词

14. Symbol

Symbol 是一种新的数据类型,它的值是唯一的,不可变的。ES6 中提出 symbol 的目的是为了生成一个唯一的标识符,不过你访问不到这个标识符:

var sym = Symbol( "some optional description" );
console.log(typeof sym); // symbol

注意,这里 Symbol 前面不能使用 new 操作符。

如果它被用作一个对象的属性,那么这个属性会是不可枚举的:

var o = {
    val: 10,
    [ Symbol("random") ]: "I'm a symbol",
};
 
console.log(Object.getOwnPropertyNames(o)); // val

如果要获取对象 symbol 属性,需要使用Object.getOwnPropertySymbols(o)。

15. 迭代器(Iterators)

迭代器允许每次访问数据集合的一个元素,当指针指向数据集合最后一个元素时,迭代器便会退出。它提供了 next() 函数来遍历一个序列,这个方法返回一个包含 done 和 value 属性的对象。

ES6 中可以通过 Symbol.iterator 给对象设置默认的遍历器,无论什么时候对象需要被遍历,执行它的 @@iterator 方法便可以返回一个用于获取值的迭代器。

数组默认就是一个迭代器:

var arr = [11,12,13];
var itr = arr[Symbol.iterator]();
 
itr.next(); // { value: 11, done: false }
itr.next(); // { value: 12, done: false }
itr.next(); // { value: 13, done: false }
 
itr.next(); // { value: undefined, done: true }

你可以通过 [Symbol.iterator]() 自定义一个对象的迭代器。

16. Generators

Generator 函数是 ES6 的新特性,它允许一个函数返回的可遍历对象生成多个值。

在使用中你会看到 * 语法和一个新的关键词 yield:

function *infiniteNumbers() {
  var n = 1;
  while (true){
    yield n++;
  }
}
 
var numbers = infiniteNumbers(); // returns an iterable object
 
numbers.next(); // { value: 1, done: false }
numbers.next(); // { value: 2, done: false }
numbers.next(); // { value: 3, done: false }

每次执行 yield 时,返回的值变为迭代器的下一个值。

17. Promises

ES6 对 Promise 有了原生的支持,一个 Promise 是一个等待被异步执行的对象,当它执行完成后,其状态会变成 resolved 或者rejected。

var p = new Promise(function(resolve, reject) {  
  if (/* condition */) {    // fulfilled successfully
    resolve(/* value */);  
  } else {    // error, rejected
    reject(/* reason */);  
  }});

每一个 Promise 都有一个 .then 方法,这个方法接受两个参数,第一个是处理 resolved 状态的回调,一个是处理 rejected 状态的回调:

p.then((val) => console.log("Promise Resolved", val),
       (err) => console.log("Promise Rejected", err));

【相关推荐:javascript视频教程web前端

以上がes6 は何から来たのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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