\\\";const Output =safeHTML`ユーザーは次のように言いました: ${userInput}`;console.log(出力); // ユーザーが言った:
function* fibonacci() {  let a = 0, b = 1;  while (true) {    yield a;    [a, b] = [b, a   b];  }}const fib = fibonacci();console.log(fib.next().value); // 0console.log(fib.next().value); // 1console.log(fib.next().value); // 1console.log(fib.next().value); // 2

長所:

短所:


5.

WeakMap と WeakSet

WeakMap と WeakSet とは何ですか?

WeakMap は、キーが弱参照されるキーと値のペアのコレクションです。これは、キーへの参照が他に存在しない場合、エントリはガベージ コレクションされることを意味します。

問題: あなたはキャッシュ システムを構築していますが、オブジェクトが不要になったら、メモリを解放するために自動的にガベージ コレクションが行われるようにしたいと考えています。

例:

let user = { name: \\\"アリス\\\" };constweakCache = new WeakMap();weakCache.set(user, \\\"キャッシュされたデータ\\\");console.log(weakCache.get(user)); // キャッシュされたデータユーザー = null; //weakCache 内のエントリはガベージ コレクションされます
function* fibonacci() {  let a = 0, b = 1;  while (true) {    yield a;    [a, b] = [b, a   b];  }}const fib = fibonacci();console.log(fib.next().value); // 0console.log(fib.next().value); // 1console.log(fib.next().value); // 1console.log(fib.next().value); // 2

長所:

短所:


6.

カレー

カリー化とは何ですか?

カリー化は、複数の引数を取る関数を、それぞれが 1 つの引数を取る一連の関数に変換します。これは、コードの柔軟性を高めることができる関数型プログラミング手法です。

問題: パーセンテージに基づいて割引を適用する関数があるとします。アプリ全体でこの関数をさまざまな割合で再利用したいと考えています。

例:

const applyDiscount = (割引) => (価格) => 価格 - 価格 * (割引 / 100);const tenPercentOff = applyDiscount(10);const TwentyPercentOff = applyDiscount(20);console.log(tenPercentOff(100)); // 90console.log(twentyPercentOff(100)); // 80
function* fibonacci() {  let a = 0, b = 1;  while (true) {    yield a;    [a, b] = [b, a   b];  }}const fib = fibonacci();console.log(fib.next().value); // 0console.log(fib.next().value); // 1console.log(fib.next().value); // 1console.log(fib.next().value); // 2

長所:

短所:


結論

これらの高度な JavaScript の概念 (プロキシ、シンボル、ジェネレーター、タグ付きテンプレート リテラル、WeakMaps、およびカリー化) はそれぞれ、より効率的、スケーラブル、またはエレガントな方法で特定の問題を解決するための独自の機能を提供します。ただし、複雑さの増加や潜在的なパフォーマンスの問題などのトレードオフが伴います。

重要なポイントは、

これらの概念をいつ、どこで使用するかを理解することです。それらが存在するからといって、すべてのプロジェクトでそれらを使用する必要があるという意味ではありません。代わりに、コードの可読性、パフォーマンス、柔軟性の向上など、明確なメリットが得られる場合にはそれらを組み込んでください。

これらの高度なテクニックを検討することで、より複雑な問題に取り組み、より強力な JavaScript を作成できるようになります。

","image":"http://www.luping.net/uploads/20241006/172821096567026815e7a06.jpg","datePublished":"2024-11-08T12:01:22+08:00","dateModified":"2024-11-08T12:01:22+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > すべての開発者が知っておくべき高度な JavaScript の概念

すべての開発者が知っておくべき高度な JavaScript の概念

2024 年 11 月 8 日に公開
ブラウズ:392

Advanced JavaScript Concepts Every Developer Should Know

JavaScript は多くの開発者が日常的に使用している言語ですが、そのエコシステム内には経験豊富な開発者でさえよく知らない隠れた宝石が数多くあります。この記事では、プログラミング スキルを大幅に向上させる、あまり知られていない JavaScript の概念について説明します。 プロキシシンボルジェネレータなどの概念を取り上げ、それぞれを例で示し、問題を解決してその威力を説明します。

最後には、JavaScript についてさらに深く理解し、これらの高度な機能をいつ使用するか (いつ使用しないのか) がわかるようになります。


1. プロキシ

プロキシとは何ですか?

JavaScript のプロキシを使用すると、プロパティの検索、割り当て、関数の呼び出しなどの基本的な操作をインターセプトしてカスタマイズできます。

問題: ユーザーが自分のアクションを追跡するオブジェクトを持つシステムを構築していると想像してください。アプリのすべての部分を変更してプロパティ アクセスを追跡する代わりに、プロキシを使用してこれらのアクションを傍受し、ログに記録できます。

例:

const user = {
  name: "Alice",
  age: 25
};

const handler = {
  get(target, prop) {
    console.log(`Property '${prop}' was accessed`);
    return prop in target ? target[prop] : `Property ${prop} doesn't exist`;
  },
};

const userProxy = new Proxy(user, handler);

console.log(userProxy.name); // Logs: Property 'name' was accessed, Returns: Alice
console.log(userProxy.address); // Logs: Property 'address' was accessed, Returns: Property address doesn't exist

長所:

  • オブジェクトとのほぼすべてのインタラクションを処理および傍受できます。
  • ロギング、検証、動的な動作に最適です。

短所:

  • 過度に使用すると、パフォーマンスのオーバーヘッドが発生する可能性があります。
  • ロジックとオブジェクトの動作の間に抽象化レイヤーがあるため、デバッグが難しくなります。

2. シンボル

シンボルとは何ですか?

シンボルは、ES6 で導入された新しいプリミティブ タイプです。これらはオブジェクト プロパティに一意のキーを提供するため、プロパティ名の衝突を回避する必要がある場合に役立ちます。

問題: サードパーティのコードと統合するオブジェクトに取り組んでおり、キーを上書きせずにカスタム プロパティを追加したいとします。

例:

const uniqueId = Symbol('id');
const user = {
  [uniqueId]: 123,
  name: "Alice"
};

console.log(user[uniqueId]); // 123
console.log(Object.keys(user)); // ['name'] - Symbol key is hidden from iteration

長所:

  • 同じ説明を共有している場合でも、シンボルは一意です。
  • 偶発的なプロパティの上書きを防止し、ライブラリや API 設計での使用に最適です。

短所:

  • シンボルは列挙可能ではないため、デバッグや反復が若干難しくなる可能性があります。
  • 過度に使用すると、コードの可読性が低下する可能性があります。

3. ジェネレーター関数

ジェネレーターとは何ですか?

ジェネレーターは一時停止および再開できる関数であり、非同期フローの管理やオンデマンドでのデータ生成に役立ちます。

問題: フィボナッチ数列を生成するとします。シーケンス全体を前もって生成する代わりに、値を 1 つずつ生成するジェネレーターを作成して、遅延評価を可能にすることができます。

例:

関数* フィボナッチ() { a = 0、b = 1 とします。 while (true) { 収量a; [a, b] = [b, a b]; } } const fib = フィボナッチ(); console.log(fib.next().value); // 0 console.log(fib.next().value); // 1 console.log(fib.next().value); // 1 console.log(fib.next().value); // 2
function* fibonacci() {
  let a = 0, b = 1;
  while (true) {
    yield a;
    [a, b] = [b, a   b];
  }
}

const fib = fibonacci();

console.log(fib.next().value); // 0
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2

長所:

    一度に数個の値だけが必要なシーケンスを生成する場合に効率的です。
  • yield と一緒に使用すると、よりクリーンな非同期フローが可能になります。

短所:

    Promise や async/await ほど一般的に使用されないため、学習曲線がより急になります。
  • 使いすぎると複雑なコードになる可能性があります。

4.

タグ付きテンプレート リテラル

タグ付きテンプレート リテラルとは何ですか?

タグ付きテンプレートを使用すると、関数を使用してテンプレート リテラルを処理できるため、CSS-in-JS ライブラリなどの DSL (ドメイン固有言語) の構築に非常に強力になります。

問題: XSS 攻撃を避けるために、ユーザー入力を処理してサニタイズするテンプレート システムを構築する必要があります。

例:

functionsafeHTML(strings, ...values) { return strings.reduce((acc, str, i) => acc str (values[i] ?scapeHTML(values[i]) : ''), ''); } 関数エスケープHTML(str) { return str.replace(/&/g, "&").replace(/, "/g, ">"); } const userInput = ""; const Output =safeHTML`ユーザーは次のように言いました: ${userInput}`; console.log(出力); // ユーザーが言った:
function* fibonacci() {
  let a = 0, b = 1;
  while (true) {
    yield a;
    [a, b] = [b, a   b];
  }
}

const fib = fibonacci();

console.log(fib.next().value); // 0
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2

長所:

    文字列補間を細かく制御できます。
  • 文字列の解析または変換 (CSS、SQL クエリなど) を必要とするライブラリの構築に最適です。

短所:

    特定のライブラリを使用する場合や独自のライブラリを作成する場合を除き、通常は必要ありません。
  • 初心者にとっては理解やデバッグが難しい場合があります。

5.

WeakMap と WeakSet

WeakMap と WeakSet とは何ですか?

WeakMap は、キーが弱参照されるキーと値のペアのコレクションです。これは、キーへの参照が他に存在しない場合、エントリはガベージ コレクションされることを意味します。

問題: あなたはキャッシュ システムを構築していますが、オブジェクトが不要になったら、メモリを解放するために自動的にガベージ コレクションが行われるようにしたいと考えています。

例:

let user = { name: "アリス" }; constweakCache = new WeakMap(); weakCache.set(user, "キャッシュされたデータ"); console.log(weakCache.get(user)); // キャッシュされたデータ ユーザー = null; //weakCache 内のエントリはガベージ コレクションされます
function* fibonacci() {
  let a = 0, b = 1;
  while (true) {
    yield a;
    [a, b] = [b, a   b];
  }
}

const fib = fibonacci();

console.log(fib.next().value); // 0
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2

長所:

    エントリの自動ガベージ コレクションにより、メモリ リークを防止します。
  • オブジェクトの有効期間が不確実な場合のキャッシュに最適です。

短所:

    WeakMap は列挙可能ではないため、反復処理が困難です。
  • キーとしてのオブジェクトのみに限定されます。

6.

カレー

カリー化とは何ですか?

カリー化は、複数の引数を取る関数を、それぞれが 1 つの引数を取る一連の関数に変換します。これは、コードの柔軟性を高めることができる関数型プログラミング手法です。

問題: パーセンテージに基づいて割引を適用する関数があるとします。アプリ全体でこの関数をさまざまな割合で再利用したいと考えています。

例:

const applyDiscount = (割引) => (価格) => 価格 - 価格 * (割引 / 100); const tenPercentOff = applyDiscount(10); const TwentyPercentOff = applyDiscount(20); console.log(tenPercentOff(100)); // 90 console.log(twentyPercentOff(100)); // 80
function* fibonacci() {
  let a = 0, b = 1;
  while (true) {
    yield a;
    [a, b] = [b, a   b];
  }
}

const fib = fibonacci();

console.log(fib.next().value); // 0
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2

長所:

    引数を事前に適用することで、関数をより再利用しやすくできます。
  • 部分的なアプリケーションを簡単に作成できます。

短所:

    関数型プログラミングに慣れていない開発者にとっては直感的ではありません。
  • 過度に使用すると、コードが過度に複雑になる可能性があります。

結論

これらの高度な JavaScript の概念 (プロキシ、シンボル、ジェネレーター、タグ付きテンプレート リテラル、WeakMaps、およびカリー化) はそれぞれ、より効率的、スケーラブル、またはエレガントな方法で特定の問題を解決するための独自の機能を提供します。ただし、複雑さの増加や潜在的なパフォーマンスの問題などのトレードオフが伴います。

重要なポイントは、

これらの概念をいつ、どこで使用するかを理解することです。それらが存在するからといって、すべてのプロジェクトでそれらを使用する必要があるという意味ではありません。代わりに、コードの可読性、パフォーマンス、柔軟性の向上など、明確なメリットが得られる場合にはそれらを組み込んでください。

これらの高度なテクニックを検討することで、より複雑な問題に取り組み、より強力な JavaScript を作成できるようになります。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/noorulhassan/advanced-javascript-concepts-every-developer-Should-know-jee?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3