🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

657閲覧

JavaScriptのMapオブジェクトは連想配列ではないのでしょうか?

theplace

総合スコア24

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/09/14 23:55

Mapオブジェクトを学んでいますが、よくわかりません。

let m = new Map(); m.set('one','un'); m.set('two','duex'); m.set('three', 'trois');     console.log(m[0]); console.log(m['one']); console.log(m.one);

上記のconsole.logの結果は全てundefinedになります。
上記の記述でインスタンスmは「キーがone、値がun」、「キーがtwo、値がduex」、「キーがthree、値がtrois」の3つの要素を持った連想配列になっていると思っていましたが違うのでしょうか(console.log(m[0])も試したのははconsole.logでmの中身を確認してなんとなく当たりをつけてみただけです)。

テキストにはMapオブジェクトはオブジェクトリテラルではないと解釈できるようなことが書かれているので、それが原因なのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

上記の記述でインスタンスmは「キーがone、値がun」、「キーがtwo、値がduex」、「キーがthree、値がtrois」の3つの要素を持った連想配列になっていると思っていましたが違うのでしょうか

いえ、「キーに対して値を保持できるもの」という機能性を考えれば、Map連想配列です。ただし、アクセス方法はgetsetなどのメソッドを使う必要があります。

むしろ、普段使っているオブジェクトリテラルのほうが、「キーとして文字列かSymbolしか使えない」「一部のObjectで予約されたキーで、妙な挙動を示す」など、連想配列としては不完全です。

投稿2019/09/15 02:13

maisumakun

総合スコア145977

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/09/15 02:21 編集

「連想配列」という単語は、「数値以外のキーに対して値を関連付けるもの」という機能性に対する名前です。特定の種類のオブジェクトに対する名前ではありません。
退会済みユーザー

退会済みユーザー

2019/09/15 06:35

重箱の隅的な話ですみません。 以下の表現ですが、否定が強すぎる気がするのでもう少しゆるい表現のほうが良いのでは? > 連想配列としては不完全です。 不完全かもしれないですけど、JavaScript で「連想配列」と言ったら、主にオブジェクトリテラルを指すと思います。勘違いしてしまう初学者が出てきそうw
H40831

2019/09/15 15:06

JavaScriptのオブジェクトは連想配列とも呼ぶ、と教えるスクールと、 JavaScriptのオブジェクトは連想配列ではない、と主張するプロの方が混在していて、わけわからないのが現状ですよね。
theplace

2019/09/16 03:01

ありがとうございます。 最近までは、 ・オブジェクト===連想配列 ・Mapオブジェクトはオブジェクトの一種 ・ゆえにMapオブジェクトも連想配列 のように考えていましたが連想配列の記述ルールが一部使えない(代わりにgetやset等の専用のメソッド?を使う)のはMapオブジェクトの特別な仕様だったんですね。 テキストでは最初にその2つが同じものと説明してから、別ページのオブジェクトを詳しく解説する箇所では「実装的には同じだが概念的には異なる」のようなことが書かれてあって、連想配列とオブジェクトはニュアンスや捉え方が異なるだけで、言語構造としては同じものだと思っていました。
guest

0

ベストアンサー

Mapの中身は

Map { 'one' => 'un', 'two' => 'duex', 'three' => 'trois' }

となっていて

一般的に言われる連想配列(Object)とは違う形なのでMapは正確には連想配列とは言えないと思います

調べてみたところでは

プログラミングにおける単純な配列は、特定のアドレスからのオフセット(ずれ)をインデックスとして、アドレスとオフセットによって目的の値を得る。これに対し連想配列では、要素とそれを紐付けできるような値(キーと呼ぶ)のペアで表され、キーによって目的の値を求める。辞書やディクショナリという呼び方は、要素を本文、キーを見出しになぞらえたものと言える。ハッシュという呼び名はハッシュテーブルによって実装されることによる。(Wikipedia)

とWikipediaの定義の考え方だとMapは連想配列と呼んで間違いは無いのではとも考えられます

なので一般的に思い浮かべる連想配列をObjectと呼びMapと差別化をするという形が適切なのかなと考えました

Mapからの値の取得は

js

1m.get('one'); // un

このように行います

投稿2019/09/15 00:05

編集2019/09/15 06:23
mouse_484

総合スコア759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mouse_484

2019/09/15 00:18

mapは連想配列かという質問の答えをしてなかったのでさせてもらうと mapは連想配列ではありません なのですが変換する方法があるので連想配列のように扱うことも出来ます
Zuishin

2019/09/15 05:42

低評価していませんが、連想配列ではないと言うなら、言うだけでなく、根拠となる連想配列の定義を示す必要があると思います。
Zuishin

2019/09/15 05:46

> 変換する方法があるので もしかして、「オブジェクト=連想配列」ということでしょうか?
mouse_484

2019/09/15 05:51

この記事を見てもらえば変換することについて概ね理解していただけると思います https://qiita.com/mktoho-n/items/6b96674c9c7ba542d2be 連想配列でないと言うならというところで maisumakunさんが言っているように不完全、正しいといい切れないというようなニュアンスで連想配列ではありませんと解答していたつもりでした
Zuishin

2019/09/15 06:01

maisumakun さんが不完全と書いているのは、あなたが連想配列と呼んでいるオブジェクトの方です。 リンクされている記事は Map とオブジェクトの変換についての記事で、用語の使い方については不正確と言わざるを得ません。
mouse_484

2019/09/15 06:03

2つ別れている解答ですが まとめて考えられていらっしゃるんですか..?
Zuishin

2019/09/15 06:04

正確な意図が伝わるよう編集し直してください。意味不明なので低評価します。
Zuishin

2019/09/15 06:21

> 一般的に言われる連想配列とは違う形なのでMapは正確には連想配列とは言えないと思います 「一般的に言われる連想配列」がわかりません。オブジェクトのことですか? Map こそプログラミングで一般的に言われる連想配列そのもののように思います。
mouse_484

2019/09/15 06:22

そうなんですねJavaScriptでは一般的にObjectの方を連想配列と呼んでいるように思われます
Zuishin

2019/09/15 06:23

Wikipedia の話をするなら > ECMAScript (JavaScript) — すべてのオブジェクトが、文字列が添え字の連想配列として扱われる。MapとWeakMap型だと添え字を任意のオブジェクトにすることができる。 と、Map は連想配列だという立場で書いてあります。
Zuishin

2019/09/15 06:35

他の言語もそうですが、JavaScript の場合は特に、初心者が聞きかじったことを理解もせずソースも引用せずに Qiita に書き散らしている傾向が強いと思います。 侍やテックも JavaScript を本丸にしてバイトがいい加減なものを書きまくっていますね。 それらは SEO に強いので検索上位に並びますが、検索上位に並ぶのと、一般にそう言われているのとは分けて考える必要があると思います。 JavaScript では長い間、連想配列はオブジェクトしかありませんでした。だからオブジェクトのことを連想配列と呼んでいる記事は、Map のそれに対して自然と多くなります。 しかし、オブジェクト=連想配列と定義している公式情報は無いはずです。MDN では「連想配列とみなすことができる」という表現に止まり、他の連想配列を否定してはいません。
theplace

2019/09/16 03:25

ありがとうございます。 私の使っているテキストではオブジェクトは「実装的には同じだが概念的には異なる」のようなことが書かれてあって、ニュアンスが異なるだけで同一だと思っていました。 「Mapオブジェクトもオブジェクトの一種なので常に自分が知っている連想配列の書き方ができるはず」だと思ってました。 しかしテキストがMapオブジェクトに差し掛かったところでその考えでは通用しないと思い戸惑いましたが、「Mapオブジェクトは(一般的な)オブジェクトではない別のオブジェクトである(Mapオブジェクトの要素を取り出すための書き方等についても仕様的に変更が加えられている)」と考えればよいということでしょうか。 そう考えれば納得がいきました。
theplace

2019/09/16 03:26

基本的なところで恐縮なのですがMapオブジェクトの実体として「= >」が出てきて驚いてしまったのですが、調べたところアロー関数?として考えて右辺('un')が関数で、それを左辺の'one'に代入していると読むのでしょうか(関数はまだ未修で、テキストのアロー関数の箇所とネットの記事を少し読んだだけでよくわかっていません)。
mouse_484

2019/09/16 03:36

その解釈で間違いないと思います わかりやすく書き直すと ("one") => { return "un" } ですかね
Lhankor_Mhy

2019/09/17 08:56 編集

横からすみません。 > 調べたところアロー関数?として考えて右辺('un')が関数で、それを左辺の'one'に代入していると読むのでしょうか それは誤りだと思います。 Mapオブジェクトのリテラルは存在しないので、「そのような記号で出力している」以上の意味はありません。アロー関数とは無関係です。 Firefox では、↓こう出力されました。 Map(3) { one → "un", two → "duex", three → "trois" }
theplace

2019/09/18 20:35

変に深く考えすぎだったかもしれなかったです。 今はgetやset等のMapオブジェクト特有の表現を使いこなせるようになるようにしたいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問