フロントエンドJavaScript ES6の詳細について

フロントエンドJavaScript ES6の詳細について

1. はじめに

ES6JavaScriptバージョン 5.1 以降の次世代標準を意味する一般的な用語であり、 ES2015ES2016 、およびES2017構文標準をカバーします。

ES6の新機能は現在、一部の新しいバージョンのブラウザでのみサポートされています。古いバージョンのブラウザで実行するには、ES6 を ES5 に変換する必要があります。

  • Chrome : バージョン 51 以降では、新しい ES6 機能の 97% をサポートします。
  • Firefox : バージョン 53 以降では、ES6 の新機能の 97% をサポートします。
  • Safari : バージョン 10 以降では、ES6 の新機能の 99% がサポートされています。
  • IE : Edge 15 は ES6 の新機能の 96% をサポートできます。 Edge 14 は新しい ES6 機能の 93% をサポートできます。 (IE7~11は基本的にES6をサポートしていません)

1.1 Babel トランスコーダ

広く使用されている ES6 トランスパイラです。

npm をインストール --save-dev @babel/core


設定ファイル.babelrc

# 最新のトランスコーディングルール $ npm install --save-dev @babel/preset-env

# react トランスコーディングルール$ npm install --save-dev @babel/preset-react
// `presets` フィールドはトランスコーディング ルールを設定します。公式 Web サイトでは次のルール セットが提供されており、必要に応じてインストールできます。
  {
    「プリセット」: [
      "@babel/env",
      「@babel/プリセット-react」
    ]、
    「プラグイン」: []
  }

1.2 ポリフィル

デフォルトでは、 Babel新しいJavaScript構文のみを変換します。新しい API をサポートするには、 polyfillを使用して現在の環境用のシムも提供する必要があります (つまり、以前のバージョンにはシムがないため、パッチを適用する必要があります)。

例: core-jsregenerator-runtime

$ npm インストール --save-dev core-js 再ジェネレーター ランタイム
'core-js' をインポートします。
'regenerator-runtime/runtime' をインポートします。

2. let と const

2.1 しましょう

スコープに関して言えば、 ES5にはグローバル スコープと関数スコープのみがあります。 letを使用して宣言された変数は、宣言されたコード ブロック内でのみ有効です。

if(true){ a = 1; var b = 2 }
console.log(a) // ReferenceError: a は定義されていません
コンソールログ(b) // 2


以下の例を見ると、グローバル変数 i は 1 つしかないため、出力は 1 になると予想されます。そのため、 for実行後、 i=5 、関数によって出力される値は常に 5 になります。

var funcs = [];
(var i = 0; i < 5; i++) の場合 {
  funcs.push(関数() {
    コンソールにログ出力します。
  });
}
関数[1](); // 5


修正: 各反復で i 変数にローカル ストレージを使用し、クロージャを使用してスコープを閉じます。

var funcs = [];
(var i = 0; i < 5; i++) の場合 { 
    (関数 () {
            var ローカル = i
            funcs.push(関数() {
                console.log(ローカル);
            });
        }
    )()
}
関数[1](); // 1


letを使用して変数 i を宣言することで、同じ効果が得られます。

2.2 定数

constは読み取り専用定数を宣言するために使用されます。初期化する必要があり、割り当て後は変更できません。 const宣言された変数にもブロック スコープがあります。

(真)の場合{
 定数 PI = 3.141515926;
 PI = 66666 // TypeError: 定数変数への代入。
}
console.log(PI) // ReferenceError: PI が定義されていません


const宣言オブジェクト

定数obj = {};
// obj に属性を追加します。これは成功です。obj.name = 'hello';

// obj を別のオブジェクトにポイントするとエラーが発生します obj = {}; // TypeError: "obj" は読み取り専用です

3. 脱構築

脱構築とは文字通り、構造を分解すること、つまり元の構造を破壊することを意味します。

3.1 オブジェクトの構造化解除

基本的な使い方:

{名前、年齢} = {名前: "こんにちは", 年齢: 12}とします。
console.log(名前、年齢) // こんにちは 12

デフォルト値の設定

{ name = 'hi', age = 12 } = { name : 'hello' } とします。
console.log(名前、年齢) // こんにちは 12


restパラメータ (形式は ... 変数名) は、オブジェクトから任意の数の要素を選択したり、残りの要素で構成されるオブジェクトを取得したりできます。

let { name, ...残り } = { name: "hello", age: 12, gender: '男' };
console.log(name, 残り) // こんにちは {年齢: 12、性別: '男性'}

3.2 配列の分割

restパラメータ (...変数名の形式) は、配列から任意の数の要素を選択するか、残りの要素の配列を取得します。

[a, ...残り] = [1, 2, 3, 4]とします。
console.log(a, 残り) // 1 [2, 3, 4]

配列の分解中に一部のメンバーは無視されます。

[a, , ...残り] = [1, 2, 3, 4]とします。
console.log(a, 残り) // 1 [3, 4]

3.3 関数パラメータの分割

配列パラメータ

関数add([x, y]){
  x + y を返します。
}
追加([1, 2]); // 3

オブジェクトパラメータ

関数 add({x, y} = { x: 0, y: 0 }) {
  x + y を返します。
}
追加します({x:1,y:2});

3.4 一般的なシナリオ

3 番目の変数を使用せずに変数を交換します。

x = 1 とします。
y = 2とします。

y = 0;

JSONデータの抽出

json = {
  コード: 0,
  データ: {名前: 'hi'}
};
{ コード、データ: ユーザー } = json;
console.log(コード、ユーザー); // 0 {名前: 'hi'}

マップ構造のトラバース

定数マップ = 新しい Map();
map.set('name', 'hello');
map.set('年齢', 12);

for (let [キー, 値] of map) {
  console.log(キー + " is " + 値);
}

4. 拡張

4.1 文字列拡張

テンプレート文字列、これは非常に便利です。これらを示すにはバッククォート (`) を使用します。通常の文字列として使用することも、複数行の文字列を定義したり、文字列に変数を埋め込んだりするために使用することもできます。

`ユーザー ${user.name} がログインしています...`);

4.2 機能拡張

ES6 、関数パラメータのデフォルト値を設定でき、パラメータ定義の直後に記述できます。

パラメータのデフォルト値が設定されると、関数が宣言され初期化されるときに、パラメータは別のcontext (コンテキスト) を形成します。初期化が完了すると、スコープは消えます。パラメータのデフォルト値が設定されていない場合、この構文の動作は発生しません。

関数 add(x, y = 1) {
 x + yを返す
}


apply() の代替

// ES5 バージョン Math.max.apply(null, [1, 3, 2])

// ES6 の書き方 Math.max(...[1, 3, 2])

4.3 配列拡張

配列の結合

// ES5 の書き方 var list = [1,2]
リスト = リスト.concat([3])

// ES6の方法 var list = [1,2]
リスト = [...リスト、3]

新しい配列 API

Array.from()、Array.of()、find()、findIndex() などについては、MDN を参照してください。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

4.4 オブジェクト拡張

オブジェクトのプロパティ、メソッドの省略形

データ = [1,2]
const resp = {data}; // 属性の省略形、{data: data} と同等
定数オブジェクト = {
  add(x, y) { // メソッドの省略形。add: function(x, y){...} と同等
    x + y を返します。
  }
};

拡張属性

定数点 = {x: 1, y: 2}
定数 pointD = {...ポイント、z: 3}
console.log(pointD) // {x: 1, y: 2, z: 3}

// 重複属性がある場合は順序に注意してください。
定数点 = {x: 1, y: 2}
定数 pointD = {...点、x: 4、z: 3}
console.log(pointD) // {x: 4, y: 2, z: 3}

定数点 = {x: 1, y: 2}
定数 pointD = {x: 4, z: 3, ...点}
console.log(pointD) // {x: 1, z: 3, y: 2}

プロパティの説明オブジェクト

オブジェクトの各プロパティには、プロパティの動作を制御するDescriptorオブジェクトがあります。

定数点 = {x: 1, y: 2}
Object.getOwnPropertyDescriptor(ポイント、'x') 
/**
{ 設定可能: true
  enumerable: true // 列挙可能な値を示します: 1
 writable: true // 書き込み可能であることを示す}
**/

属性トラバーサル

  • for...inループ: オブジェクト自体と継承された列挙可能なプロパティのみを走査します。
  • Object.keys() : オブジェクト自体のすべての列挙可能なプロパティのキー名を返します。
  • JSON.stringify() : オブジェクト自身の列挙可能なプロパティのみをシリアル化します。
  • Object.assign() : enumerableプロパティがfalseであるプロパティを無視し、オブジェクト自身の列挙可能プロパティのみをコピーします。
定数点 = {x: 1, y: 2}
for(let key in point){
  console.log(キー)
}

オブジェクトの新しいメソッド: Object.assign()

Object.assign()メソッドは、ディープ コピーではなく、シャロー コピーを実行します。つまり、ソース オブジェクトのプロパティの値がオブジェクトの場合、ターゲット オブジェクトはこのオブジェクトへの参照をコピーします。一般的な用途:

オブジェクトの複製

関数クローン(origin) {
  Object.assign({}, origin) を返します。
}

オブジェクトの結合

const merge = (target, ...sources) => Object.assign(target, ...sources);

デフォルト値の指定

定数DEFAULT_CONFIG = {
  デバッグ: true、
};

関数プロセス(オプション) {
  オプション = Object.assign({}, DEFAULT_CONFIG, オプション);
  console.log(オプション);
  // ...
}

4.5 演算子の拡張

指数演算子

2 ** 10 // 1024
2 ** 3 ** 2 // 512 は 2 ** (3 ** 2) に等しい

let a=10; a **= 3; // a = a * a * a と同等

演算子の連鎖

obj?.propオブジェクト プロパティが存在するかどうかを判断し、 func?.(...args)関数またはオブジェクト メソッドが存在するかどうかを判断します。

const obj = {name: 'job', say(){console.log('hello')}}
obj?.name // obj == null と等しい ? undefined : obj.name
obj?.say() // obj == null と等しい ? undefined : obj.say()


ヌルチェック演算子

JavaScriptでは、デフォルト値を指定するために || 演算子を使用します。 左側がnullまたはundefined場合にのみデフォルト値をトリガーしたい場合は、?? を使用します。

const obj = {名前: ''}
obj.name || 'hello' // 'hello'
obj.name ?? 'hello' // ''

5. ~のために

for...inループは主にオブジェクトをトラバースするために設計されており、配列のキーは数値であるため、配列をトラバースすると数値が返されます。明らかに、これでは開発のニーズを満たすことはできません。for for...of使用すると、この問題を解決できます。

定数リスト = ['a', 'b', 'c']
for (let v in list){
  コンソール.log(v) // 0,1,2
}
for (let v of list){
  console.log(v) // a,b,c
}

6. まとめ

フロントエンド JavaScript ES6 の詳細に関するこの記事はこれで終わりです。より関連性の高いJavaScript ES6コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript ES6 分割演算子の理解と応用
  • シンプルなカルーセルの最も完全なコード分析を実装するJavaScript(ES6オブジェクト指向)
  • シンプルなショッピングカートの最も完全なコード分析を実装する JavaScript (ES6 オブジェクト指向)
  • JavaScript es6 における var、let、const の違いの詳細な説明
  • JS における ES6 継承と ES5 継承の違い
  • Node.jsがES6モジュールを処理する方法の詳細な説明
  • JS ES6コーディング標準の詳細な説明
  • JSでES6クラスの使い方をすぐにマスター
  • JS ES6 変数分割代入の詳細な説明
  • JS ES6 スプレッド演算子の魔法のような使い方

<<:  Docker で Rancher をデプロイする方法 (落とし穴なし)

>>:  Deepin20.1 システムは MySQL8.0.23 をインストールします (非常に詳細な MySQL8 インストール チュートリアル)

推薦する

MySQLユーザー権限管理の詳細な説明

目次序文: 1. ユーザー権利の概要2. 実際の権限管理序文:データベースのユーザー権限管理について...

Vue3のレスポンシブ原則の詳細な説明

目次Vue2 レスポンシブ原則のレビューVue3 レスポンシブ原則の分析ネストされたオブジェクトの応...

テーブル適応とオーバーフローのいくつかの設定の詳細な説明

1. テーブル リセットの 2 つのプロパティ: ①border-collapse: collaps...

VMwareのCentosシステムでNavicatがMySQLサーバーに接続できない問題を解決します

ホスト 'xxxx' はこの MySQL サーバーに接続できませんエラー: 1130...

Linux システムでのスケジュールされたタスクの紹介

目次1. 計画タスクをカスタマイズする2. 時間を同期する3. 練習する4. セキュリティの問題1....

MAC で MySQL の初期パスワードを変更する方法

問題の説明: Macを購入し、初めてMySQLをインストールしました。初期パスワードが分かりません。...

MySQL ステートメントにおける IN と Exists の比較分析

背景最近、SQL 文を書くときに、IN と Exists のどちらを選択するか迷ったので、両方の方法...

レスポンシブ原則のソースコード分析のVue解釈

目次初期化初期化状態()初期化プロパティ()初期化データ()観察する()オブザーバーリアクティブを定...

resizeを使用して画像切り替えプレビュー機能を実装する方法

要点CSS resize プロパティを使用すると、要素のサイズ変更可能性を制御できます。サイズ変更を...

lnmp を使用して MySQL データベースのルート パスワードをリセットする 2 つの方法

最初の方法: Junge のワンクリック スクリプトを使用して、LNMP 環境で MYSQL データ...

CSS 標準: vertical-align プロパティ

<br />原文: http://www.mikkolee.com/13私は最近、ver...

MySQL がデータの削除と挿入に非常に時間がかかる問題の解決策

会社の開発者がテスト環境で挿入ステートメントを実行すると、正常に実行されるまでに 10 秒以上かかり...

MySQL 8.0 に移行する際の注意点 (要約)

パスワードモードPDO::__construct(): サーバーがクライアントに不明な認証方法を要求...

JavaScriptは検証コードと検証のランダム生成を実装します

この記事では、検証コードのランダム生成と検証を実現するためのJavaScriptの具体的なコードを参...

MySQL 8.0 が起動できない 3534 の解決策

MySQL 8.0 サービスを開始できません最近、 cmdで MySQL サービスを起動するときに遭...