WEBVTT

1
00:00:00.000 --> 00:00:00.949
こんにちは。

2
00:00:00.949 --> 00:00:05.853
今回はジャバスクリプトのリフレクト・オウンキーズを紹介します。

3
00:00:05.853 --> 00:00:12.181
これは、オブジェクト自身が持つキーを、漏れなく配列で取り出すためのメソッドです。

4
00:00:12.181 --> 00:00:21.040
普段よく使うオブジェクトキーズでは、表示から隠されたプロパティや、シンボルをキーにしたプロパティは出てきません。

5
00:00:21.040 --> 00:00:29.425
リフレクト・オウンキーズなら、列挙できるかどうかに関係なく、文字列キーとシンボルキーの両方を取得できます。

6
00:00:29.425 --> 00:00:39.233
ライブラリーが返したオブジェクトの中身を調べたいときや、設定データに想定外の項目が紛れていないか確かめたいときに役立ちます。

7
00:00:39.233 --> 00:00:43.741
この動画では、基本の書き方から、キーが並ぶ順番、配列を渡したときの注意点、

8
00:00:43.741 --> 00:00:48.250
エラーになるケースまで、順に解説します。

9
00:00:48.250 --> 00:00:53.130
まず、なぜキー一覧に出てこない項目があるのかを押さえましょう。

10
00:00:53.130 --> 00:00:57.380
プロパティには、列挙可能かどうかという設定があります。

11
00:00:57.380 --> 00:01:02.417
普通に代入して作ったプロパティは列挙可能で、一覧に表示されます。

12
00:01:02.417 --> 00:01:06.903
一方、オブジェクト・デファインプロパティで作ったプロパティは、明示しない限り非列挙になり、

13
00:01:06.903 --> 00:01:11.389
通常の一覧から外れます。

14
00:01:11.389 --> 00:01:15.482
でも非列挙は、アクセス禁止という意味ではありません。

15
00:01:15.482 --> 00:01:18.000
名前を知っていれば値は読めます。

16
00:01:18.000 --> 00:01:21.778
もう一つが、シンボルをキーにしたプロパティです。

17
00:01:21.778 --> 00:01:25.084
こちらもオブジェクトキーズには現れません。

18
00:01:25.084 --> 00:01:30.278
隠れているだけで存在する項目を見逃さないことが、今回のテーマです。

19
00:01:30.278 --> 00:01:32.439
基本の書き方を見ましょう。

20
00:01:32.439 --> 00:01:39.421
リフレクト・オウンキーズと書き、かっこの中に調べたいオブジェクトを一つだけ渡します。

21
00:01:39.421 --> 00:01:44.574
引数には、通常のオブジェクトだけでなく、配列や関数も渡せます。

22
00:01:44.574 --> 00:01:48.065
戻り値は、キーを要素に持つ新しい配列です。

23
00:01:48.065 --> 00:01:53.551
要素は文字列かシンボルで、キーが一つもなければ空の配列が返ります。

24
00:01:53.551 --> 00:01:59.536
ここで大切なのは、対象がオブジェクト自身のプロパティだけだという点です。

25
00:01:59.536 --> 00:02:03.691
プロトタイプから継承したプロパティは含まれません。

26
00:02:03.691 --> 00:02:11.505
さらに、戻ってきた配列を書き換えても、元のオブジェクトからプロパティが消えることはありません。

27
00:02:11.505 --> 00:02:15.328
結果はあくまでキーの一覧表だと考えてください。

28
00:02:15.328 --> 00:02:18.589
よく使うオブジェクトキーズとの違いを整理します。

29
00:02:18.589 --> 00:02:23.345
オブジェクトキーズが取るのは、自身の、列挙可能な、文字列キーだけです。

30
00:02:23.345 --> 00:02:25.111
条件が三つ重なっています。

31
00:02:25.111 --> 00:02:28.916
これに対してリフレクト・オウンキーズは、自身のキーであれば、列挙可能かどうかも、

32
00:02:28.916 --> 00:02:32.720
文字列かシンボルかも問いません。

33
00:02:32.720 --> 00:02:37.680
似た役割のメソッドに、非列挙も含む文字列だけを取るものや、シンボルだけを取るものもありますが、

34
00:02:37.680 --> 00:02:42.639
両方を一度にそろえられるのがオウンキーズの強みです。

35
00:02:42.639 --> 00:02:46.987
画面表示用の項目を取りたいだけならオブジェクトキーズで十分です。

36
00:02:46.987 --> 00:02:50.792
構造を漏れなく調べたいときこそ、オウンキーズの出番です。

37
00:02:50.792 --> 00:02:52.694
目的に合わせて選びましょう。

38
00:02:52.694 --> 00:02:56.563
次に、キーが並ぶ順番のルールを覚えましょう。

39
00:02:56.563 --> 00:03:04.125
通常のオブジェクトでは、まず配列の添字に当たる文字列キーが、数値の小さい順に並びます。

40
00:03:04.125 --> 00:03:11.687
次に、その他の文字列キーが作られた順に続き、最後にシンボルキーが作られた順に並びます。

41
00:03:11.687 --> 00:03:19.250
たとえば十というキーを先に、二というキーを後に追加しても、結果は二、十の順になります。

42
00:03:19.250 --> 00:03:23.998
しかも戻り値の中では、これらは数値ではなく文字列です。

43
00:03:23.998 --> 00:03:31.384
注意したいのは、ゼロイチやマイナス一のような書き方は、添字としては扱われない点です。

44
00:03:31.384 --> 00:03:39.474
入力した順番そのものを記録したい用途では、この並び替えに頼らず、順番を別に管理してください。

45
00:03:39.474 --> 00:03:41.001
ここからは実例です。

46
00:03:41.001 --> 00:03:45.122
継承した項目、数値に見えるキー、非列挙の項目、シンボルキーを持つオブジェクトを作って、

47
00:03:45.122 --> 00:03:49.244
取得範囲を確かめます。

48
00:03:49.244 --> 00:03:54.434
まず内部という説明を持つシンボルを作り、親オブジェクトを用意します。

49
00:03:54.434 --> 00:03:57.792
セッティングズは、その親を継承して作ります。

50
00:03:57.792 --> 00:04:02.982
タイトルを通常の代入で加え、十番と二番を数値に見えるキーで加えます。

51
00:04:02.982 --> 00:04:10.615
さらにヒドゥンという項目を、列挙できない設定で追加し、シンボルキーには内部識別子という値を入れます。

52
00:04:10.615 --> 00:04:14.737
画面表示では見えにくい項目を、あえてそろえた構成です。

53
00:04:14.737 --> 00:04:19.774
次のセクションで、このオブジェクトからキーを取り出してみましょう。

54
00:04:19.774 --> 00:04:21.818
実行結果を確認しましょう。

55
00:04:21.818 --> 00:04:30.464
リフレクト・オウンキーズで取れる全キーは、二、十、タイトル、ヒドゥン、そしてシンボル・インターナルの五つです。

56
00:04:30.464 --> 00:04:35.337
一方、通常の一覧では、二、十、タイトルの三つしか出てきません。

57
00:04:35.337 --> 00:04:39.268
差の二つこそ、非列挙のヒドゥンとシンボルキーです。

58
00:04:39.268 --> 00:04:43.669
また、親から継承したインヘリテッドは結果に含まれません。

59
00:04:43.669 --> 00:04:47.128
自身のキーだけを取る、という約束どおりです。

60
00:04:47.128 --> 00:04:54.831
表示のためにキーを文字列へ変換していますが、実際の配列の中には元のシンボルそのものが入っています。

61
00:04:54.831 --> 00:05:00.962
だからこそ、保存しておいたシンボルと同一かどうかを、そのまま判定できるのです。

62
00:05:00.962 --> 00:05:03.164
配列を渡した場合の注意点です。

63
00:05:03.164 --> 00:05:07.276
配列もオブジェクトの一種なので、オウンキーズに渡せます。

64
00:05:07.276 --> 00:05:12.708
エーとビーの二つの要素を持つ配列なら、結果はゼロ、一、レングスとなります。

65
00:05:12.708 --> 00:05:16.673
最後のレングスは、配列自身が持つ非列挙プロパティです。

66
00:05:16.673 --> 00:05:20.196
つまり、取得結果は要素の添字だけとは限りません。

67
00:05:20.196 --> 00:05:25.923
そのため、返ってきた配列の長さを、そのまま要素の数として使うと誤りになります。

68
00:05:25.923 --> 00:05:30.621
要素数が必要なら、配列のレングスプロパティを直接読んでください。

69
00:05:30.621 --> 00:05:38.550
配列の要素だけを処理したい場面では、そもそもオウンキーズではなく、配列向けの繰り返し処理を使う方が安全です。

70
00:05:38.550 --> 00:05:41.179
失敗するケースも知っておきましょう。

71
00:05:41.179 --> 00:05:44.903
ヌルやアンデファインドはもちろん、文字列や数値などのプリミティブ値を渡すと、

72
00:05:44.903 --> 00:05:48.628
タイプエラーが発生します。

73
00:05:48.628 --> 00:05:53.885
たとえば文字列を渡して、文字の位置の一覧を得るような使い方はできません。

74
00:05:53.885 --> 00:06:01.042
このメソッドは同期的で、結果はすぐに配列として返るので、アウェイトやプロミスの失敗処理は不要です。

75
00:06:01.042 --> 00:06:02.941
例外はその場で発生します。

76
00:06:02.941 --> 00:06:07.833
外部から受け取った値がオブジェクトかどうか分からない場合は、処理全体をトライ・キャッチで囲み、

77
00:06:07.833 --> 00:06:12.726
エラー時の扱いを先に決めておきましょう。

78
00:06:12.726 --> 00:06:18.130
エラーメッセージの文面は環境で変わるため、文面で判定しないことも大切です。

79
00:06:18.130 --> 00:06:20.287
細かな落とし穴を二つ押さえます。

80
00:06:20.287 --> 00:06:22.309
一つ目はシンボルの同一性です。

81
00:06:22.309 --> 00:06:27.836
インターナルという同じ説明でシンボルを二つ作っても、それぞれは別のキーになります。

82
00:06:27.836 --> 00:06:32.823
ところが表示用に文字列へ変換すると、どちらも同じ見た目になってしまいます。

83
00:06:32.823 --> 00:06:37.272
表示文字列をキーの識別や照合に使うと、別物を同じものと誤認します。

84
00:06:37.272 --> 00:06:40.372
照合には、元のシンボルを必ず保持してください。

85
00:06:40.372 --> 00:06:41.855
二つ目はプロキシです。

86
00:06:41.855 --> 00:06:46.034
通常のオブジェクトでは、キー取得だけでゲッターは呼ばれません。

87
00:06:46.034 --> 00:06:49.741
しかし対象がプロキシだと、取得処理に独自の処理が介入し、順番が変わったり、

88
00:06:49.741 --> 00:06:53.448
例外が発生したりすることがあります。

89
00:06:53.448 --> 00:06:57.627
調査ツールでは取得自体をトライ・キャッチで守る設計が有効です。

90
00:06:57.627 --> 00:06:59.639
最後に活用場面とまとめです。

91
00:06:59.639 --> 00:07:06.966
リフレクト・オウンキーズは、ライブラリーを更新したあとにオブジェクトの構造が変わっていないか調べたり、

92
00:07:06.966 --> 00:07:14.294
設定オブジェクトのキーを、文字列とシンボルの両方について許可リストと照合したりする場面に向いています。

93
00:07:14.294 --> 00:07:18.748
値を全部読み出さず、まずキーだけを確認できる点も調査向きです。

94
00:07:18.748 --> 00:07:22.915
ただし、キーが存在することと、値が正しいことは別問題です。

95
00:07:22.915 --> 00:07:26.219
値の型や妥当性の検査は、別に設計してください。

96
00:07:26.219 --> 00:07:28.231
導入の合言葉はシンプルです。

97
00:07:28.231 --> 00:07:35.271
表示用の項目が欲しいならオブジェクトキーズ、見えない項目まで含めて構造を調べたいならオウンキーズ。

98
00:07:35.271 --> 00:07:37.714
この使い分けを覚えておきましょう。

99
00:07:37.714 --> 00:07:39.007
お疲れさまでした。
