WEBVTT

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

2
00:00:00.987 --> 00:00:05.595
今回はジャバスクリプトのオブジェクト・イズを紹介します。

3
00:00:05.595 --> 00:00:11.189
これは、二つの値が同じかどうかを判定する、比較のためのメソッドです。

4
00:00:11.189 --> 00:00:17.278
普段の比較で十分な場面も多いのですが、数値には少し特殊なケースがあります。

5
00:00:17.278 --> 00:00:22.214
計算に失敗したことを表すナン同士や、符号だけが違うゼロです。

6
00:00:22.214 --> 00:00:28.632
オブジェクト・イズは、ナン同士を同じ値と扱い、正のゼロと負のゼロを区別します。

7
00:00:28.632 --> 00:00:33.486
この動画では、厳密等価演算子との違いから、変更検知への活用、オブジェクト比較の注意点までを、

8
00:00:33.486 --> 00:00:38.340
実行結果と一緒に学びます。

9
00:00:38.340 --> 00:00:42.948
何を同じと見なすかを自分で選べるようになるのが目標です。

10
00:00:42.948 --> 00:00:49.036
判断に迷ったら、まずこの二つのケースに当てはまるかを確認してみてください。

11
00:00:49.036 --> 00:00:50.991
まず、困りごとから見ます。

12
00:00:50.991 --> 00:00:56.707
計算結果を前回の値と比べて、変わったときだけ処理したい場面を考えてください。

13
00:00:56.707 --> 00:01:01.897
ところが厳密等価演算子では、ナンとナンを比べても結果はフォルスになり、計算できない状態が続いていても、

14
00:01:01.897 --> 00:01:07.086
毎回変化したように見えてしまいます。

15
00:01:07.086 --> 00:01:13.254
逆に、ゼロとマイナスゼロはトゥルーになり、符号が変わっても変化なしと判定されます。

16
00:01:13.254 --> 00:01:18.368
画面のとおり、オブジェクト・イズではナン同士がトゥルーに変わります。

17
00:01:18.368 --> 00:01:21.527
すべての比較を置き換える必要はありません。

18
00:01:21.527 --> 00:01:26.039
この二つのケースが問題になる場面でこそ、選ぶ意味があります。

19
00:01:26.039 --> 00:01:31.304
この小さなずれが、不要な再処理や、大切な変化の見逃しの原因になります。

20
00:01:31.304 --> 00:01:33.404
引数と戻り値を確認します。

21
00:01:33.404 --> 00:01:38.574
呼び出し方は、オブジェクト・イズに比べたい値を二つ渡すだけです。

22
00:01:38.574 --> 00:01:44.229
インスタンスを作らず、オブジェクトに直接指定して呼ぶ静的メソッドです。

23
00:01:44.229 --> 00:01:49.398
戻り値は真偽値で、同じ値ならトゥルー、異なる値ならフォルスです。

24
00:01:49.398 --> 00:01:57.476
画面の例では、数値の十二同士はトゥルー、文字列の十二と数値の十二は型が違うのでフォルスになりました。

25
00:01:57.476 --> 00:01:59.576
型の自動変換は行いません。

26
00:01:59.576 --> 00:02:07.493
数値以外も渡せて、文字列なら内容と順序を比べ、オブジェクトなら同じものを参照しているかを比べます。

27
00:02:07.493 --> 00:02:11.047
比較対象そのものを変更する処理もありません。

28
00:02:11.047 --> 00:02:15.732
なお、引数の順序を入れ替えても、比較の結果は変わりません。

29
00:02:15.732 --> 00:02:17.926
基本の実行例を読みます。

30
00:02:17.926 --> 00:02:26.517
変数オリジナルにカウントを持つオブジェクトを入れ、別の変数エイリアスに同じものを代入しました。

31
00:02:26.517 --> 00:02:32.732
この二つは同じオブジェクトを指しているので、比較結果はトゥルーです。

32
00:02:32.732 --> 00:02:40.958
一方、その場で新しく作った、見た目が同じオブジェクトと比べても、結果はフォルスになります。

33
00:02:40.958 --> 00:02:48.636
記事の完全な例では、数値、型の違う値、ナン、ゼロ、参照の八件を並べて確認しています。

34
00:02:48.636 --> 00:02:57.228
このコードは、ノード・ジェイエスの実機でも、記事の期待出力と完全に一致することを確認済みです。

35
00:02:57.228 --> 00:03:01.432
ブラウザーのコンソールでも同じ結果になります。

36
00:03:01.432 --> 00:03:03.084
結果の読み方を整理します。

37
00:03:03.084 --> 00:03:04.990
違いが出るのは二か所だけです。

38
00:03:04.990 --> 00:03:06.133
一つ目はナンです。

39
00:03:06.133 --> 00:03:10.072
厳密等価ではフォルスですが、オブジェクト・イズではトゥルーで、計算できないという状態が続いたことを、

40
00:03:10.072 --> 00:03:14.011
同じ状態として扱えます。

41
00:03:14.011 --> 00:03:15.663
二つ目は符号付きゼロです。

42
00:03:15.663 --> 00:03:19.475
厳密等価ではプラスゼロとマイナスゼロを区別できませんが、オブジェクト・イズではフォルスとなり、

43
00:03:19.475 --> 00:03:23.287
符号の変化を検出できます。

44
00:03:23.287 --> 00:03:25.955
この比較規則はセームバリューと呼ばれます。

45
00:03:25.955 --> 00:03:32.054
それ以外の値については、厳密等価とほぼ同じ結果になるので、違いはこの二点に絞って覚えてください。

46
00:03:32.054 --> 00:03:35.612
この対応だけを覚えておけば、結果の読み間違いは防げます。

47
00:03:35.612 --> 00:03:37.205
対応環境を確認します。

48
00:03:37.205 --> 00:03:42.273
オブジェクト・イズは、二千十五年九月から主要ブラウザー間で利用できる機能で、

49
00:03:42.273 --> 00:03:47.341
現在のクローム、エッジ、ファイアフォックス、サファリで使えます。

50
00:03:47.341 --> 00:03:51.830
ノード・ジェイエスでも利用でき、記事の実行対象は二十二系です。

51
00:03:51.830 --> 00:03:57.332
サンプルは標準のジャバスクリプトだけで、外部ライブラリーも通信も使いません。

52
00:03:57.332 --> 00:04:02.835
ただし、古いブラウザーや組み込み環境まで無条件に対応するわけではありません。

53
00:04:02.835 --> 00:04:10.944
画面のように、タイプオブで関数として存在するかを確認してから使うと、未対応の環境でもエラーを避けて案内できます。

54
00:04:10.944 --> 00:04:12.394
活用例を見ます。

55
00:04:12.394 --> 00:04:19.463
計算結果が次々に届くとき、変化したときだけ履歴を残せば、記録の量を減らせます。

56
00:04:19.463 --> 00:04:28.162
ここでは、五、五、ナン、ナン、ゼロ、マイナスゼロ、マイナスゼロ、八という八件の並びを処理します。

57
00:04:28.162 --> 00:04:35.231
方針は、ナンが続く場合は同じ状態と扱い、ゼロの符号が変われば記録することです。

58
00:04:35.231 --> 00:04:41.756
前回の値と現在の値をオブジェクト・イズで比べ、異なる場合だけ記録します。

59
00:04:41.756 --> 00:04:50.456
まだ記録がない状態を表す変数を別に用意しているのは、最初の入力を偶然の一致で省略しないためです。

60
00:04:50.456 --> 00:04:56.799
表示用の関数でも、負のゼロを見分けられるよう、同じ比較を使っています。

61
00:04:56.799 --> 00:05:01.874
外部ライブラリーは使わず、標準の機能だけで書ける例です。

62
00:05:01.874 --> 00:05:03.748
実行結果を読み解きます。

63
00:05:03.748 --> 00:05:07.495
八件の入力に対して、記録は五件だけになりました。

64
00:05:07.495 --> 00:05:12.178
重なった五とナンは、それぞれ一回だけ記録され、ゼロからマイナスゼロへの変化は、

65
00:05:12.178 --> 00:05:16.862
符号の違いとしてしっかり記録されています。

66
00:05:16.862 --> 00:05:19.673
最後の八も新しい値として残りました。

67
00:05:19.673 --> 00:05:25.137
この結果も、ノード・ジェイエスの実機出力と一致することを確認済みです。

68
00:05:25.137 --> 00:05:32.163
注意点として、ナンの発生回数自体を障害の分析に使う場合は、この方法で省略してはいけません。

69
00:05:32.163 --> 00:05:36.534
重複を省いてよい情報なのかを決めてから導入してください。

70
00:05:36.534 --> 00:05:39.657
省略のルールを先に決めることが大切です。

71
00:05:39.657 --> 00:05:40.991
大切な注意点です。

72
00:05:40.991 --> 00:05:47.514
名前にオブジェクトと付いていますが、プロパティの中身を一つずつ調べる関数ではありません。

73
00:05:47.514 --> 00:05:53.000
画面の例では、状態を別の変数に代入したあと、カウントを二に書き換えました。

74
00:05:53.000 --> 00:05:59.819
参照は変わっていないので比較はトゥルーのままで、前の変数から見たカウントも二になっています。

75
00:05:59.819 --> 00:06:03.525
つまり、この代入は過去の内容の保存にはなりません。

76
00:06:03.525 --> 00:06:08.047
変更検知に使うなら、変更前の数値を別に保持するか、オブジェクトを直接書き換えず、

77
00:06:08.047 --> 00:06:12.569
新しい参照へ置き換える設計にしてください。

78
00:06:12.569 --> 00:06:17.609
内容同士の比較が必要なら、対象の項目と比較の規則を自分で明示します。

79
00:06:17.609 --> 00:06:23.539
参照が同じかどうかと、内容が同じかどうかは、別の問いとして分けて考えてください。

80
00:06:23.539 --> 00:06:25.617
もう二つの制約を確認します。

81
00:06:25.617 --> 00:06:27.399
一つ目は小数の誤差です。

82
00:06:27.399 --> 00:06:32.150
レイ点イチ足すレイ点ニと、レイ点サンの比較はフォルスになります。

83
00:06:32.150 --> 00:06:40.315
浮動小数点の誤差を吸収する機能はないので、測定値などを比べる場合は、許容できる誤差の幅を別に設計してください。

84
00:06:40.315 --> 00:06:45.660
また、二つの値が同じと判定されても、業務で使える正しい値とは限りません。

85
00:06:45.660 --> 00:06:50.559
ナンを同じ状態と扱うことと、その値を保存してよいかは別の判断です。

86
00:06:50.559 --> 00:06:57.091
二つ目は処理の性質で、このメソッドは同期的に真偽値を返すため、非同期の後始末は不要です。

87
00:06:57.091 --> 00:07:01.991
ただし、引数として渡す式が例外を出せば、比較自体は実行されません。

88
00:07:01.991 --> 00:07:07.929
未対応環境への備えは、対応環境のセクションで紹介した存在確認がそのまま使えます。

89
00:07:07.929 --> 00:07:08.932
まとめです。

90
00:07:08.932 --> 00:07:15.282
オブジェクト・イズは、ナン同士を同じと扱い、符号付きゼロを区別する比較です。

91
00:07:15.282 --> 00:07:22.636
通常の比較をすべて置き換える必要はなく、厳密等価で困る二つのケースがあるときに選びます。

92
00:07:22.636 --> 00:07:26.814
導入の前に、扱うデータについて二つ決めてください。

93
00:07:26.814 --> 00:07:33.332
計算できない状態が続いたら同じと見なすか、そしてゼロの符号に意味があるかです。

94
00:07:33.332 --> 00:07:38.847
このルールがはっきりすれば、変更検知のような処理で迷わず使えます。

95
00:07:38.847 --> 00:07:47.704
練習として、ナンとマイナスゼロを含む小さな配列を用意し、記録される変化を予想してから実行してみてください。

96
00:07:47.704 --> 00:07:52.885
小さな例で結果を確かめる習慣が、比較の使い分けを確実にします。

97
00:07:52.885 --> 00:07:54.389
お疲れさまでした。
