目次
如何遍历对象
如何删除属性
WeakSet
比较总结
结语
ホームページ ウェブフロントエンド jsチュートリアル JavaScript の Map、WeakMap、Set、WeakSet についての簡単な説明

JavaScript の Map、WeakMap、Set、WeakSet についての簡単な説明

Jan 30, 2021 pm 06:19 PM
javascript map set

JavaScript の Map、WeakMap、Set、WeakSet についての簡単な説明

JavaScript 開発者の 70% 以上は、プロジェクト内のデータの収集と維持にのみオブジェクトを使用していると思います。確かに、Map や Set などの新しいコレクション オブジェクトは、2015 年に登場したときでさえ十分に活用されていませんでした。

そこで、今日は、2015 年の驚くべき新機能、MapSetWeakMapWeakSet ## について説明します。 #。

お読みになる前に

    この記事は、これらを使用することのみを推奨するものではありません。しかし、一部の受験者がコーディング試験でこれらのいずれかを使用しているのを見たことがあり、私は特定の状況でこれらを使用するのが好きです。プロジェクト内でいつ使用するかを決定するのはあなた次第です。
  • 私の議論をよりよく理解するには、反復可能とは何かを知っておく必要があります。
オブジェクト

まず、オブジェクトの使用方法について説明します。

わかりました。皆さんは新しいコレクション オブジェクトについて学ぶためにこの記事をクリックしたので、90% 以上の人がこの部分をすでに知っていると思いますが、JavaScript の初心者のために、簡単に言ってみましょう。

const algorithm = { site: "leetcode" };
console.log(algorithm.site); // leetcode

for (const key in algorithm) {
  console.log(key, algorithm[key]);
}

// site leetcode
delete algorithm.site;
console.log(algorithm.site); // undefined
ログイン後にコピー

そこで、

algorithm オブジェクトを作成しました。そのキーと値は文字列型の値で、. キーワード値を使用して呼び出しました。

さらに、

for-in ループは、オブジェクトのループ処理にも非常に適しています。 [] キーワードを使用して、キーに対応する値にアクセスできます。ただし、オブジェクトは反復可能ではないため、for-of ループは使用できません。

オブジェクトのプロパティは、

delete キーワードを使用して削除できます。この方法でオブジェクトのプロパティを完全に削除できますが、このメソッドと混同しないように注意してください。

const algorithm = { site: "leetcode" };
// Property is not removed!!
algorithm.site = undefined;
// Property is removed!!
delete algorithm.site;
ログイン後にコピー

algorithm.site = unknown は、新しい値を site に割り当てるだけです。

さて、オブジェクトについていくつかのことを簡単に説明しました。

    プロパティを追加する方法
  • オブジェクトを反復処理する方法
  • 方法プロパティを削除するには
Map

Map は、オブジェクトのように機能する JavaScript の新しいコレクション オブジェクトです。ただし、通常のオブジェクトと比較すると、いくつかの大きな違いがあります。

まず、Map オブジェクトを作成する簡単な例を見てみましょう。

属性の追加方法

const map = new Map();
// Map(0) {}
ログイン後にコピー

マップ 何も作成する必要はありませんが、データの追加方法が少し異なります。

map.set('name', 'john');
// Map(1) {"name" => "john"}
ログイン後にコピー

Map には、

set と呼ばれるプロパティを追加する特別な方法があります。 2 つのパラメータを取ります。キーが最初のパラメータで、値が 2 番目のパラメータです。

map.set('phone', 'iPhone');
// Map(2) {"name" => "john", "phone" => "iPhone"}
map.set('phone', 'iPhone');
// Map(2) {"name" => "john", "phone" => "iPhone"}
ログイン後にコピー

ただし、既存のデータを追加することはできません。新しいデータのキーに対応する値が Map オブジェクトにすでに存在する場合、新しいデータは追加されません。

map.set('phone', 'Galaxy');
// Map(2) {"name" => "john", "phone" => "Galaxy"}
ログイン後にコピー

ただし、既存のデータを他の値で上書きすることもできます。

オブジェクトを反復処理する方法

Map は反復可能なオブジェクトです。つまり、

for-of ステートメントを使用してマップできることを意味します。

for (const item of map) {
  console.dir(item);
}
// Array(2) ["name", "john"]
// Array(2) ["phone", "Galaxy"]
ログイン後にコピー

覚えておくべきことの 1 つは、Map はデータを配列の形式で提供するため、キーまたは値を取得するには配列を構造化するか、各インデックスにアクセスする必要があるということです。

キーまたは値のみを取得するには、いくつかのメソッドを使用できます。

map.keys();
// MapIterator {"name", "phone"}
map.values();
// MapIterator {"john", "Galaxy"}
map.entries();
// MapIterator {"name" => "john", "phone" => "Galaxy"}
ログイン後にコピー

スプレッド演算子 (

...) を使用してマップのデータ全体を取得することもできます。これは、スプレッド演算子が反復可能なオブジェクトに対してバックグラウンドで動作するためです。

const simpleSpreadedMap = [...map];
// [Array(2), Array(2)]
ログイン後にコピー

属性を削除する方法

Map オブジェクトからデータを削除するのも簡単です。

delete を呼び出すだけです。

map.delete('phone');
// true
map.delete('fake');
// false
ログイン後にコピー

delete delete 関数がデータを正常に削除したかどうかを示すブール値を返します。そうである場合は true を返し、そうでない場合は false を返します。

WeakMap

WeakMap は Map から派生したものであるため、互いに非常に似ています。ただし、WeakMap は大きく異なります。

WeakMap という名前の由来は何ですか?それは、参照リンクが指すデータ オブジェクトとの接続または関係が Map ほど強くないため、弱いためです。

それで、これは何を意味するのでしょうか?

違い 1: キーはオブジェクトである必要があります

const John = { name: 'John' };
const weakMap = new WeakMap();
weakMap.set(John, 'student');
// WeakMap {{...} => "student"}
weakMap.set('john', 'student');
// Uncaught TypeError: Invalid value used as weak map key
ログイン後にコピー

Map オブジェクトには任意の値をキーとして渡すことができますが、WeakMap は異なります。オブジェクトのみをキーとして受け入れます。それ以外の場合は、間違いを返します。

違い 2: Map のすべてのメソッドがサポートされているわけではありません

WeakMap を使用できるメソッドは次のとおりです。

    delete
  • get
  • has
  • set
このトピックの最大の違いは、WeakMap が次のことを行うことです。反復オブジェクト メソッドはサポートされていません。しかし、なぜ?これについては以下で説明します。

違い 3: GC が参照をクリーンアップすると、データが削除されます

Map と比較すると、これが最大の違いです。

let John = { major: "math" };

const map = new Map();
const weakMap = new WeakMap();

map.set(John, 'John');
weakMap.set(John, 'John');

John = null;
/* John 被垃圾收集 */
ログイン後にコピー

John オブジェクトがガベージ コレクションされると、Map オブジェクトは参照リンクを維持しますが、WeakMap オブジェクトはリンクを失います。したがって、WeakMap を使用する場合は、この機能を考慮する必要があります。

Set

Set も Map とよく似ていますが、単一の値の場合は Set の方が便利です。

属性を追加する方法

const set = new Set();

set.add(1);
set.add('john');
set.add(BigInt(10));
// Set(4) {1, "john", 10n}
ログイン後にコピー

Map と同様に、Set も同じ値を追加できなくなります。

set.add(5);
// Set(1) {5}

set.add(5);
// Set(1) {5}
ログイン後にコピー

如何遍历对象

由于Set是一个可迭代的对象,因此可以使用 for-offorEach 语句。

for (const val of set) {
  console.dir(val);
}
// 1
// 'John'
// 10n
// 5

set.forEach(val => console.dir(val));
// 1
// 'John'
// 10n
// 5
ログイン後にコピー

如何删除属性

这一部分和 Map 的删除完全一样。如果数据被成功删除,它返回 true,否则返回 false

set.delete(5); 
// true

set.delete(function(){});
// false;
ログイン後にコピー

如果你不想将相同的值添加到数组表单中,则Set可能会非常有用。

/* With Set */
const set = new Set();
set.add(1);
set.add(2);
set.add(2);
set.add(3);
set.add(3);
// Set {1, 2, 3}

// Converting to Array
const arr = [ ...set ];
// [1, 2, 3]

Object.prototype.toString.call(arr);
// [object Array]

/* Without Set */
const hasSameVal = val => ar.some(v === val);
const ar = [];

if (!hasSameVal(1)) ar.push(1);
if (!hasSameVal(2)) ar.push(2);
if (!hasSameVal(3)) ar.push(3);
ログイン後にコピー

WeakSet

与WeakMap一样,WeakSet也将丢失对内部数据的访问链接(如果内部数据已被垃圾收集)。

let John = { major: "math" };

const set = new Set();
const weakSet = new WeakSet();

set.add(John);
// Set {{...}}
weakSet.add(John);
// WeakSet {{...}}

John = null;
/* John 被垃圾收集 */
ログイン後にコピー

一旦对象 John 被垃圾回收,WeakSet就无法访问其引用 John 的数据。而且WeakSet不支持 for-offorEach,因为它不可迭代。

比较总结

相同点:添加相同的值不支持。

Map vs. WeakMap:WeakMap仅接受对象作为键,而Map不接受。

Map and Set:

  • 可迭代的对象,支持 for..offorEach... 运算符
  • 脱离GC关系

WeakMap and WeakSet:

  • 不是一个可迭代的对象,不能循环。
  • 如果引用数据被垃圾收集,则无法访问数据。
  • 支持较少的方法。

结语

不过,我想,很多团队或公司还是没有使用Maps或Sets。也许是因为他们觉得没有必要,或者是因为数组仍然可以做到几乎所有他们想要的东西。

然而,在JavaScript中,Maps或Sets可能是非常独特和强大的东西,这取决于每个情况。所以我希望有一天,你能有机会使用它们。

原文地址:https://medium.com/better-programming/map-weakmap-set-weakset-in-javascript-77ecb5161e3

作者:Moon

更多编程相关知识,请访问:编程入门!!

以上がJavaScript の Map、WeakMap、Set、WeakSet についての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

MyBatis動的SQLタグのSetタグ機能の詳細説明 MyBatis動的SQLタグのSetタグ機能の詳細説明 Feb 26, 2024 pm 07:48 PM

MyBatis 動的 SQL タグの解釈: Set タグの使用法の詳細な説明 MyBatis は、豊富な動的 SQL タグを提供し、データベース操作ステートメントを柔軟に構築できる優れた永続層フレームワークです。このうち、Set タグは、UPDATE ステートメントで SET 句を生成するために使用され、更新操作でよく使用されます。この記事では、MyBatis での Set タグの使用法を詳細に説明し、特定のコード例を通じてその機能を示します。 SetタグとはMyBatiで使用するSetタグです。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

Go 言語マップのパフォーマンスを最適化する Go 言語マップのパフォーマンスを最適化する Mar 23, 2024 pm 12:06 PM

Go 言語マップのパフォーマンスの最適化 Go 言語では、マップは非常に一般的に使用されるデータ構造であり、キーと値のペアのコレクションを保存するために使用されます。ただし、大量のデータを処理すると、マップのパフォーマンスが低下する可能性があります。マップのパフォーマンスを向上させるために、いくつかの最適化措置を講じてマップ操作の時間の複雑さを軽減し、それによってプログラムの実行効率を向上させることができます。 1. マップ容量の事前割り当て: マップを作成するときに、容量を事前に割り当てることで、マップの拡張回数を減らし、プログラムのパフォーマンスを向上させることができます。一般的に、私たちは

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

See all articles