teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

Object.create(null)

2017/12/11 08:45

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,6 +1,16 @@
1
+ ### 数値添字配列
2
+
1
3
  JavaScriptの配列は**数値添字配列**であり、文字列添字配列に対応していないからです。
2
- 文字列添字配列が必要な場合は、オブジェクト初期化子もしくは `new Map` を使用する事になります。
4
+ 文字列添字配列が必要な場合は、次のいずれかを使用する事になります。
3
5
 
6
+ - オブジェクト初期化子(`{}`)
7
+ - `Object.create(null)`
8
+ - `new Map`
9
+
10
+ ### new Map
11
+
12
+ Map には `Map.prototype.forEach` があるので、比較的扱いやすいといえます。
13
+
4
14
  ```JavaScript
5
15
  'use strict';
6
16
  function foo (string) {
@@ -17,6 +27,31 @@
17
27
 
18
28
  console.log(map.get('a')); // 1
19
29
  console.log(JSON.stringify([...map.entries()])); // [["a","1"],["b","2"],["c","3"]]
30
+
31
+ map.forEach((value, key) => console.log(value, key));
20
32
  ```
21
33
 
34
+ ### Object.create(null)
35
+
36
+ `Object.create(null)` は `{}` とほぼ等価ですが、プロトタイプ上にオブジェクトが存在しない為、`__proto__` 等の規定値となる名前もキー名に出来るメリットがあります。
37
+
38
+ ```JavaScript
39
+ 'use strict';
40
+ function foo2 (string) {
41
+ var object = Object.create(null);
42
+
43
+ for (var i = 0, array = string.split(','), len = array.length, entry; i < len; ++i) {
44
+ entry = array[i].split(':');
45
+ object[entry[0]] = entry[1];
46
+ }
47
+
48
+ return object;
49
+ }
50
+
51
+ var object = foo2('a:1,b:2,c:3');
52
+
53
+ console.log(object.a); // 1
54
+ Object.keys(object).forEach(key => console.log(key, object[key]));
55
+ ```
56
+
22
57
  Re: tesopgmh さん