「オブジェクト」と「連想配列」というのを混同していると思います。JavaScriptには「連想配列」はありません。ただ、「オブジェクト」を連想配列っぽく使うことができるというだけです。
JavaScriptの世界ではすべてのものがObjectです。
StringもNumberもFunctionもObjectです。
「連想配列っぽく使えるやつ」もObjectです。
MapもObjectです。つまり、Objectを継承しています。
すべてのものがObjectなので、無茶苦茶なことができます。「Object」というのは「無茶苦茶なことができるやつ」ということを意味しています。
下記は new String()
でStringオブジェクトを生成した例です。
Objectなので独自にメンバーを追加することができるし、
StringなのでcharCodeAtメソッドを持っているし、
ObjectなのでtoStringメソッドを持っています (String to String !?)
js
1let string = new String('The Earth');
2string.answer = 42;
3console.log(string, 'charCodeAt' in string, 'toString' in string);
4// String {"The Earth", answer: 42} true true
オブジェクトリテラル {}
で生成されるオブジェクトは当然 Object です。神みたいなやつなのでなんでもできます。連想配列っぽく使うこともできます。
Mapオブジェクトも Object を継承していますので、神にできることはなんでもできます。そのうえで、より連想配列として扱いやすくするためのメンバーが追加されています。次世代の神みたいなやつです。
たとえば、次のような違いがあります。
js
1const obj = {};
2const map = new Map();
3const emp = Object.create(null);
4
5obj.name = 'The Earth';
6obj.answer = 42;
7
8map.set('name', 'The Earth');
9map.set('answer', 42);
10
11emp.name = 'The Earth';
12emp.answer = 42;
13
14
15// 要素の数を取得したい
16console.log(Object.keys(obj).length); // -> 2 (empも同じ)
17console.log(map.size); // -> 2
18
19
20// すべての要素に、あるいはすべての要素を使って何らかの処理をしたい
21Object.keys(obj).forEach(key => {
22 console.log(key, obj[key]);
23}); // (empも同じ)
24
25map.forEach((val, key) => {
26 console.log(key, val)
27});
28
29
30// 自由な値をキーにしたい
31// ここが「クリーン」の論旨と思います
32obj.toString = 'foo';
33console.log(obj.toString); // -> 'foo' (toString() メソッドが消滅する)
34
35map.set('toString', 'foo');
36console.log(map.get('toString'); // -> 'foo'
37console.log(map.toString); // -> ƒ toString() { [native code] }
38
39emp.toString = 'foo';
40console.log(emp.toString); // -> 'foo' (toString() メソッドはそもそも存在しないので、問題ないといえばない)
長々書きましたが、まあこんな感じです。
MDM も参考になると思います。
連想配列として使いたいObject | 使いやすさ |
---|
{} で生成 | 使える |
new Map() で生成 | 便利に使える (適している) |
Object.create(null) で生成 | 使いにくい |
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/08 09:00
2019/10/08 09:03
2019/10/08 10:05
2019/10/08 10:11
2019/10/08 10:18
2019/10/08 10:19
2019/10/08 10:25
2019/10/09 00:25
2019/10/09 00:34 編集
2019/10/09 01:06
2019/10/09 01:08
2019/10/09 01:10 編集
2019/10/09 01:11
2019/10/09 01:20
2019/10/09 01:24 編集
2019/10/09 01:24
2019/10/09 01:31
2019/10/09 01:33 編集