この記事では、ES6 について詳しく説明し、ES6 の新機能について学びます。お役に立てば幸いです。
フロントエンド (vue) マスタリーコースへのエントリー: ラーニングに入る
ECMAScript
、Netscape によって開発された脚本语言的标准化规范
です。当初はMocha
という名前でしたが、後にLiveScript
に改名され、最終的にはJavaScript
に改名されました。
ECMAScript 2015 (ES2015) バージョン 6 (当初は ECMAScript 6 (ES6
) として知られていました) には、新しい機能が追加されています。
ES6 ブロック スコープ レット
まず、スコープとは何でしょうか?スコープとは単に変数を宣言することを意味します。この変数の有効なスコープはlet
来る前です。 js にはvar
の全局作用域
と函数作用域
のみがあり、 ES6
块级作用域
が js に導入されます。
{ var a = "?"; b = "⛳" とします。 } コンソール.ログ(a); コンソール.ログ(b);
? キャッチされない参照エラー: b が定義されていません
ご覧のとおり、ブロック内で変数 a を定義するために var キーワードを使用していますが、実際にはグローバルにアクセスできます。したがって、 var声明的变量是全局的
はブロック内で有効になるようにする必要があります。いいえ、 ES6
の新しいブロック レベルのスコープ キーワードlet
使用して変数 a を宣言できます。再度アクセスすると、 a is not defined
、というエラーが報告されます。
以下に示すように、まず配列を返す関数を定義してから、非構造化配列を使用し、その配列を呼び出して戻り値を temp に代入し、解构数组
を使用した後、配列変数を直接定義します。次に、関数の戻り値は変数を指します。最初の項目の値は最初の配列変数に、2 番目の項目は 2 番目の配列変数に自動的に割り当てられます。最後に 3 つの変数が出力されます。問題。
関数朝食() { 戻る ['?'、 '?'、 '?']; } var temp = 朝食(); console.log(temp[0], temp[1], temp[2]); let [a, b, c] = breakfast(); console.log(a, b, c);
? ? ? ?
まず、 breakfast
解构对象
は对象
を返します。キーと値のペアのキーは、割り当てが完了した後のカスタム変数を表します。次に、オブジェクトを返すために Breakfast 関数が呼び出され、変数 a、b、c が表示されます。問題がないことがわかります。
関数朝食() { return { a: '?'、b: '?'、c: '?' } } let { a: a, b: b, c: c } = breakfast(); console.log(a, b, c);
? ?
テンプレート文字列を使用する前に、+ を使用して文字列変数を連結します。
ES6 が提供するテンプレート文字列を使用します。 ${变量}
を使用する場合は、最初に `` を使用して文字列をラップします。
a = '?' とします。 b = '?️'; let c = '今日食べる' + a + '食べたら見る' + b; コンソール.ログ(c); let d = `今日 ${a} を食べて、${b} を食べた後に見てください`; コンソール.ログ(d);
今日は食べる?食べてから見よう? 今日は食べる?食べてから見よう?
これらの関数を使用すると、文字列が何かで始まるかどうか、文字列が何かで終わるかどうか、文字列が含まれているかどうかなどの操作を簡単に実行できます。
let str = 'こんにちは、私はシャオ・ジョウです❤️'; console.log(str.startsWith('Hello')); console.log(str.endsWith('❤️')); console.log(str.endsWith('Hello')); console.log(str.includes(" "));
真実 真実 間違い 真実
ES6 では、関数を呼び出すときに、パラメータに値が割り当てられていない場合は、設定されたデフォルト パラメータを使用して実行されます。パラメータに値が割り当てられると、新しく割り当てられたパラメータを使用して実行されます。値を使用して、デフォルト値を上書きします。
関数 Say(str) { コンソール.ログ(文字列); } function Say1(str = 'Hey') { コンソール.ログ(文字列); } 言う(); Say1(); Say1('❤️');
未定義 おいおい❤️
...
使用して要素を展開し、操作を簡単にします。
let arr = ['❤️', '?', '?']; コンソール.ログ(arr); console.log(...arr); let brr = ['王子', ...arr]; コンソールログ(brr); console.log(...brr);
[「❤️」、「?」、「?」 ❤️ ? [「王子様」、「❤️」、「?」、「?」 王子様❤️?
...
演算子は関数パラメータで使用され、パラメータの配列を受け取ります。次のように使用されます。
関数 f1(a, b, ...c) { console.log(a, b, c); console.log(a, b, ...c); } f1('?','?','☃️','㊙️');
? ? [「☃️」、「㊙️」] ☃️㊙️
.name
使用して関数の名前を取得できます。具体的な使用方法は次のとおりです。
関数 f1() { } console.log(f1.name); let f2 = function () { }; console.log(f2.name); let f3 = function f4() { }; console.log(f3.name);
f1 f2 f4
アロー関数を使用するとコードをより簡潔にすることができますが、アロー関数の制限にも注意する必要があります。アロー関数自体にはこれがありません。これは親を指します。
f1 = a => a; とします。 let f2 = (a, b) => { a + b を返します。 } console.log(f1(10)); console.log(f2(10, 10));
10 20
es6のオブジェクト式を利用すると、オブジェクトの属性が値と同じであれば値を省略でき、関数を書く際にfunction
省略することができます。 使い方は以下の通りです。
a = '㊙️'; b = '☃️' とします。 const obj = { あ:あ、 b: b、 言う: function () { } } const es6obj = { ああ、 b、 言う() { } } コンソール.ログ(obj); コンソール.ログ(es6obj);
{ a: '㊙️'、b: '☃️'、say: [関数:say] } { a: '㊙️'、b: '☃️'、say: [関数:say] }
const
キーワードを使用して測定を定義します。const const
測定に値を割り当てるアクションを制限しますが、測定内の値は制限しません。
const app = ['☃️', '?']; console.log(...app); app.push('?'); console.log(...app); アプリ = 10;
測定値に値を再度割り当てると、エラーが報告されることがわかります。
☃️ ? ☃️ ? アプリ = 10; ^ TypeError: 定数変数への代入。
オブジェクト属性を定義するためにドットを使用する場合、属性名にスペース文字が含まれている場合、それは不正であり、構文を渡すことができません。 [属性名]
を使用すると、問題を完全に解決できます。また、属性名を直接記述するだけでなく、属性名を直接記述することもできます。具体的な使い方は以下の通りです。
obj = {} にします。 let a = '小さな名前'; obj.name = '王子'; // 属性を定義するためにドットを使用し、途中にスペースを入れることは違法です。 // obj.little name = 'Little Prince'; obj[a] = '星の王子さま'; コンソール.ログ(obj);
{ 名前: '王子'、'小さな名前': '星の王子さま' }
===
または==
を使用して一部の特殊な値を比較した結果は、ニーズを満たしていない可能性があります。Object.is Object.is(第一个值,第二个值)
使用して判断すると、満足できるかもしれません。
console.log(NaN == NaN); console.log(+0 == -0); console.log(Object.is(NaN, NaN)); console.log(Object.is(+0, -0));
間違い 真実 真実 間違い
次のように、 Object.assign()
を使用して、あるオブジェクトを別のオブジェクトにコピーします。
obj = {} にします。 オブジェクト.assign( // ソースオブジェクト、 //対象オブジェクトをコピー { a: '☃️' } ); コンソール.ログ(obj);
{ a: '☃️' }
es6 を使用して、次のようにオブジェクトのプロトタイプを設定できます。
obj1 = { にします 得る() { 1を返します。 } } obj2 = { にします 答え: 10、 得る() { 2を返します。 } } let test = Object.create(obj1); console.log(test.get()); console.log(Object.getPrototypeOf(test) === obj1); Object.setPrototypeOf(test, obj2); console.log(test.get()); console.log(Object.getPrototypeOf(test) === obj2);
1 真実 2 真実
obj1 = { にします 得る() { 1を返します。 } } obj2 = { にします 答え: 10、 得る() { 2を返します。 } } let テスト = { __proto__:obj1 } console.log(test.get()); console.log(Object.getPrototypeOf(test) === obj1); test.__proto__ = obj2; console.log(test.get()); console.log(Object.getPrototypeOf(test) === obj2);
1 真実 2 真実
obj1 = { にします 得る() { 1を返します。 } } let テスト = { __proto__: obj1、 得る() { super.get() + ' ☃️' を返します。 } } console.log(test.get());
1 ☃️
学習する前に、まずイテレータを作成します
関数 die(arr) { i = 0 とします。 戻る { 次() { 完了 = (i >= arr.length); let value = !done ? arr[i++] : 未定義; 戻る { 値: 値、 完了:完了 } } } } let arr = ['☃️', '?', '?']; dieArr = die(arr); とします。 console.log(dieArr.next()); console.log(dieArr.next()); console.log(dieArr.next()); console.log(dieArr.next());
{ 値: '☃️'、完了: false } { 値: '?'、完了: false } { 値: '?'、完了: false } { 値: 未定義、完了: true }
OK、簡略化されたジェネレーターを見てみましょう
関数* die(arr) { for (let i = 0; i < arr.length; i++) { arr[i] を生成します。 } } let test = die(['?','☃️']); console.log(test.next()); console.log(test.next()); console.log(test.next());
{ 値: '?'、完了: false } { 値: '☃️'、完了: false } { 値: 未定義、完了: true }
es6 を使用すると、クラスを迅速かつ便利に構築できます。
クラスストゥ { コンストラクター(名前) { this.name = 名前; } 言う() { return this.name + 'Say Ori'; } } let xiaoming = new stu("小明"); console.log(xiaoming.say());
シャオミンはオリが与えたと言った
クラス属性を取得または変更するための get/set メソッドを定義する
クラスストゥ { コンストラクター(名前) { this.name = 名前; } 得る() { this.name を返します。 } set(newStr) { this.name = newStr; } } let xiaoming = new stu("小明"); console.log(xiaoming.get()); xiaoming.set("ダーミン") console.log(xiaoming.get());
シャオミンとダミン
static キーワードで変更されたメソッドは、オブジェクトをインスタンス化せずに直接使用できます。
クラスストゥ { 静的say(str) { コンソール.ログ(文字列); } } stu.say("元の静的メソッド");
Origi の静的メソッド
継承を使用すると、次のようなコードの冗長性を減らすことができます。
クラス人 { コンストラクター(名前, bir) { this.name = 名前; this.bir = bir; } showInfo() { return '名前:' + this.name + '誕生日:' + this.bir; } } クラス A は Person { を拡張します。 コンストラクター(名前, bir) { スーパー(名前、bir); } } let zhouql = new A("周啓洛", "2002-06-01"); // Zhou Qiluo 自体には showInfo メソッドはなく、人の console.log(zhouql.showInfo()) から継承されます。
名前: 周祁洛 誕生日: 2002-06-01
配列とは異なり、セット コレクションでは、セット コレクション内の要素の重複は許可されません。
// Set コレクションを作成します let food = new Set('??'); // 繰り返し追加します。food.add('?'); には 1 つだけを入れることができます。 food.add('?'); コンソール.ログ(食べ物); //現在のコレクションのサイズ console.log(food.size); // 要素がコレクションに存在するかどうかを判断します console.log(food.has('?')); // コレクション内の要素を削除します food.delete('?'); コンソール.ログ(食べ物); // コレクションをループします food.forEach(f => { コンソール.ログ(f); }); // コレクションをクリア food.clear(); コンソール.ログ(食べ物);
セット(3) { '?'、'?'、'?' } 3 真実 セット(2) { '?'、'?' } ? ? セット(0) {}
マップを組み合わせてキーと値のペアを保存します
let food = new Map(); a = {}、b = function () { }、c = "名前"; food.set(a, '?'); food.set(b, '?'); food.set(b, '?'); food.set(c, 'ご飯'); コンソール.ログ(食べ物); コンソール.ログ(食べ物.サイズ); console.log(food.get(a)); 食品.削除(c); コンソール.ログ(食べ物); console.log(food.has(a)); food.forEach((v, k) => { console.log(`${k} + ${v}`); }); food.clear(); コンソール.ログ(食べ物);
Map(3) { {} => '?', [関数: b] => '?', '名前' => '米' } 3 ? Map(2) { {} => '?', [関数: b] => '?' } 真実 [オブジェクト オブジェクト] + ? 関数 () { } + ? 地図(0) {}
es6 は、モジュラー開発を使用して、一部のコンテンツだけでなく、デフォルトのエクスポートやその他の詳細を簡単にインポートおよびエクスポートできます。
a = '?' とします。 let f1 = function (str = 'パラメータ') { コンソール.ログ(文字列); } エクスポート { a, f1 };
'./27moduletest.js' から {a, f1} をインポートします。 コンソール.ログ(a); f1(); f1('わかった');