1
1
2
2
# オブジェクトからプリミティブへの変換
3
3
4
- オブジェクトが加算 ` obj1 + obj2 ` 、減算 ` obj1 - obj2 ` , または ` alert(obj) ` を使って出力されたとき何が起きるでしょう ?
4
+ オブジェクトが加算 ` obj1 + obj2 ` 、減算 ` obj1 - obj2 ` , または ` alert(obj) ` を使って出力されるとき、何が起きるでしょう ?
5
5
6
6
オブジェクトには、変換を行う特別なメソッドがあります。
7
7
8
- チャプター < info:type-conversions > で、私たちは、 プリミティブな数値、文字列や真偽値変換のルールを見てきました。しかしオブジェクトへのギャップが残っています。ここまでで、我々はメソッドとシンボルについて学んだので、それを閉じることができます 。
8
+ チャプター < info:type-conversions > では、 プリミティブな数値、文字列や真偽値変換のルールを見てきました。しかしまだオブジェクトが残っています。ここまでのチュートリアルでメソッドとシンボルについて学んだので、今ならそれらを理解することができます 。
9
9
10
10
[ cut]
11
11
12
- オブジェクトの場合、すべてのオブジェクトは真偽値コンテキストでは ` true ` なので 、真偽値への変換はありません。従って 、文字列と数値変換だけです。
12
+ オブジェクトの場合、すべてのオブジェクトは真偽値のコンテキストでは ` true ` になるため 、真偽値への変換はありません。そのため 、文字列と数値変換だけです。
13
13
14
- 数値変換は、オブジェクトを減算する、もしくは数学的な関数を適用する時に起こります 。例えば ` Date ` オブジェクト(チャプター < info:date > で説明されています)は減算することができ、 ` date1 - date2 ` の結果は2つの日付間の時間差になります。
14
+ 数値変換は、オブジェクトを減算したり数学的な関数を適用する時に発生します 。例えば ` Date ` オブジェクト(チャプター < info:date > で説明されています)は減算することができ、 ` date1 - date2 ` の結果は2つの日付間の時間差になります。
15
15
16
16
文字列変換はどうかというと -- 通常、` alert(obj) ` のようにオブジェクトを出力したり、似たようなコンテキストのときに起こります。
17
17
18
18
## ToPrimitive
19
19
20
- プリミティブが必要とされるコンテキストでオブジェクトが使われる場合、例えば ` alert ` や数学的な操作 、` ToPrimitive ` アルゴリズム([ スペック] ( https://tc39.github.io/ecma262/#sec-toprimitive ) )を使ってプリミティブ値に変換されます。
20
+ プリミティブが必要とされるコンテキストでオブジェクトが使われる場合、例えば ` alert ` や数学的な操作と言ったような場合 、` ToPrimitive ` アルゴリズム([ スペック] ( https://tc39.github.io/ecma262/#sec-toprimitive ) )を使ってプリミティブ値に変換されます。
21
21
22
- そのアルゴリズムによって 、特別なオブジェクトメソッドを使って変換をカスタマイズすることができます。
22
+ そのアルゴリズムは 、特別なオブジェクトメソッドを使って変換をカスタマイズすることができます。
23
23
24
- コンテキストに応じて、変換にはいわゆる "ヒント " があります。
24
+ コンテキストに応じて、変換にはいわゆる "hint " があります。
25
25
26
- 3つのバリアントがあります :
26
+ 3つのケースがあります :
27
27
28
28
` "string" `
29
- : 操作が ` alert ` のように文字列を期待するとき -- オブジェクトから文字列への変換 :
29
+ : 操作が ` alert ` のように文字列を期待するとき -- オブジェクトから文字列への変換をします :
30
30
31
31
```js
32
32
// 出力
37
37
```
38
38
39
39
` "number" `
40
- : 操作が数学のように数値を期待するとき -- オブジェクトから数値への変換 :
40
+ : 操作が数学のように数値を期待するとき -- オブジェクトから数値への変換をします :
41
41
42
42
```js
43
43
// 明示的な変換
54
54
` "default" `
55
55
: 操作がどんな型を期待しているか "よくわからない" ようなレアケースで起こります
56
56
57
- 例えば、バイナリプラス `+` は文字列(それらを連結します )と数値(それらを足します )両方で動作するので、文字列と数値の両方が有りえます 。または、オブジェクトが `==` を使用して、文字列、数値またはシンボルと比較されるときです。
57
+ 例えば、二項演算子 `+` は文字列(それらの連結 )と数値(それらの加算 )両方で動作するので、文字列と数値の両方の場合がありえます 。または、オブジェクトが `==` を使用して、文字列、数値またはシンボルと比較されるときです。
58
58
59
59
```js
60
- // バリナリプラス
60
+ // 二項演算子 +
61
61
let total = car1 + car2;
62
62
63
63
// obj == string/number/symbol
64
64
if (user == 1) { ... };
65
65
```
66
66
67
- より大きい/小さい演算子 `<>` もまた文字列と数字両方を扱うことができますが、これは "default" ではなく "number" を使います。これは歴史的な理由によるものです。
67
+ より大なり/小なり演算子 `<>` もまた文字列と数字両方を扱うことができますが、これは "default" ではなく "number" を使います。これは歴史的な理由によるものです。
68
68
69
- 実際には、1つのケース (`Date` オブジェクトです 。後ほど学びます)を除くすべての組み込みオブジェクトは `"number"` と同じ方法で `"default"` 変換を実装しています 。そして、恐らく私たちは同じようにするべきです 。
69
+ 実際には、1つのケース (`Date` オブジェクトの場合です 。後ほど学びます)を除くすべての組み込みオブジェクトは `"number"` と `"default"` 変換は同じ方法で実装されています 。そして、恐らく私たちも同じようにするべきです 。
70
70
71
- 留意してください -- 3つだけ ヒント があります。 それはシンプルです。 "真偽値" の ヒント はありません(真偽値のコンテキストにおいては、すべてのオブジェクトは ` true ` です)。そして、ほとんどの組み込みのように、もし ` "default" ` と ` "number" ` を同じように扱うと、2つの変換しかありません 。
71
+ 留意してください -- 3つだけ hint があり、 それはシンプルです。 "真偽値" はありません(真偽値のコンテキストにおいては、すべてのオブジェクトは ` true ` です)。そして、ほとんどの組み込みのように、` "default" ` と ` "number" ` を同じように扱うと、変換は2つしかありません 。
72
72
73
73
** 変換をするために、JavaScriptは3つのオブジェクトのメソッドを見つけ呼び出そうとします。**
74
74
75
75
1 . メソッドが存在する場合、` obj[Symbol.toPrimitive](hint) ` を呼び出します
76
- 2 . そうでない場合 、hint が ` "string" ` であれば
76
+ 2 . ない場合 、hint が ` "string" ` であれば
77
77
- ` obj.toString() ` と ` obj.valueOf() ` を試します。
78
- 3 . そうでない場合 、hint が ` "number" ` であれば
78
+ 3 . そうでなく 、hint が ` "number" ` であれば
79
79
- ` obj.valueOf() ` と ` obj.toString() ` を試します。
80
80
81
81
## Symbol.toPrimitive
82
82
83
- 最初のメソッドから始めてみましょう。` Symbol.toPrimitive ` という名前の組み込みシンボルがあります。このシンボルは、次のように変換メソッドに名前を付けるために使用します 。
83
+ 最初のメソッドから始めてみましょう。` Symbol.toPrimitive ` という名前の組み込みシンボルがあります。このシンボルは、次のように変換メソッドの名前として使用します 。
84
84
85
85
``` js
86
86
obj[Symbol .toPrimitive ] = function (hint ) {
@@ -89,7 +89,7 @@ obj[Symbol.toPrimitive] = function(hint) {
89
89
}
90
90
```
91
91
92
- 例えば、ここで ` user ` オブジェクトはそれを実装しています :
92
+ 例えば、これは ` Symbol.toPrimitive ` を実装した ` user ` オブジェクトです :
93
93
94
94
``` js run
95
95
let user = {
@@ -102,37 +102,37 @@ let user = {
102
102
}
103
103
};
104
104
105
- // 変換デモo :
105
+ // 変換動作の確認 :
106
106
alert (user); // hint: string -> {name: "John"}
107
107
alert (+ user); // hint: number -> 1000
108
108
alert (user + 500 ); // hint: default -> 1500
109
109
```
110
110
111
- コードから分かるように、` user ` は変換に応じて、自己記述的な文字列、または金額になります。1つのメソッド ` user[Symbol.toPrimitive] ` がすべての変換ケースを扱います 。
111
+ コードから分かるように、` user ` は変換に応じて、文字列または金額になります。1つのメソッド ` user[Symbol.toPrimitive] ` がすべての変換ケースを扱っています 。
112
112
113
113
114
114
## toString/valueOf
115
115
116
- メソッド ` toString ` と ` valueOf ` は古代から来ています 。それらはシンボルではなく(シンボルはずっと前には存在しませんでした)が、"通常の" 文字列で名前付けされたメソッドです。それらは変換を実装するための代替の "古いスタイル" の方法を提供します。
116
+ メソッド ` toString ` と ` valueOf ` は古代からあります 。それらはシンボルではなく(シンボルはずっと前には存在しませんでした)が、"通常の" 文字列で名前付けされたメソッドです。それらは変換を行うための代替の "古いスタイル" の方法を提供します。
117
117
118
- もしも、 ` Symbol.toPrimitive ` がない場合、JavaScriptはそれらを見つけ、次の順でトライします:
118
+ ` Symbol.toPrimitive ` がない場合、JavaScriptはそれらを見つけ、次の順でトライします:
119
119
120
- - ` toString -> valueOf ` "string" hint のために.
121
- - ` valueOf -> toString ` そうでない場合.
120
+ - ` toString -> valueOf ` "string" hint の場合
121
+ - ` valueOf -> toString ` そうでない場合
122
122
123
- 例えば、ここで ` user ` は ` toString ` と ` valueOf ` をあわせて使って上と同じことをしています :
123
+ 例えば、ここで ` user ` は ` toString ` と ` valueOf ` を使って上と同じことをしています :
124
124
125
125
``` js run
126
126
let user = {
127
127
name: " John" ,
128
128
money: 1000 ,
129
129
130
- // for hint="string"
130
+ // hint="string" の場合
131
131
toString () {
132
132
return ` {name: "${ this .name } "}` ;
133
133
},
134
134
135
- // for hint="number" or "default"
135
+ // hint="number" or "default" の場合
136
136
valueOf () {
137
137
return this .money ;
138
138
}
@@ -144,7 +144,7 @@ alert(+user); // valueOf -> 1000
144
144
alert (user + 500 ); // valueOf -> 1500
145
145
```
146
146
147
- 多くの場合、すべてのプリミティブ変換を処理する単一の "すべてのキャッチ " が必要です。 この場合、次のように ` toString ` だけを実装することで実現できます :
147
+ 多くの場合、すべてのプリミティブ変換が処理できる "あらゆる状況に対応できる場所 " が必要です。 この場合、次のように ` toString ` を実装するだけで実現できます :
148
148
149
149
``` js run
150
150
let user = {
@@ -164,17 +164,17 @@ alert(user + 500); // toString -> John500
164
164
165
165
## ToPrimitive と ToString/ToNumber
166
166
167
- すべてのプリミティブ変換メソッドを知るのに重要なことは、それらは必ずしも "ほのめかされた" プリミティブを返さないことです 。
167
+ すべてのプリミティブ変換メソッドについて知っておくべき重要なことは、それらが必ずしも "hint" のプリミティブを返すわけではないということです 。
168
168
169
- ` toString() ` が正しく文字列を返すか、もしくは ` Symbol.toPrimitive ` メソッドが "number" のヒントで数値を返すかはコントロール出来ません 。
169
+ ` toString() ` が正しく文字列を返すか、もしくは ` Symbol.toPrimitive ` メソッドが "number" の hint で数値を返すかはコントロールできません 。
170
170
171
- ** 唯一の必須なこと: それらのメソッドはプリミティブを返す必要があります 。**
171
+ ** 唯一の必須事項は、これらのメソッドはプリミティブを返す必要がある、ということです 。**
172
172
173
- 変換が開始された操作では、そのプリミティブが取得され、引き続き処理が行われます。必要に応じてさらに変換が適用されます 。
173
+ 変換が行われるとプリミティブが返却され、その後引き続き処理が行われます。必要に応じてさらに変換が行われます 。
174
174
175
175
例えば:
176
176
177
- - 数学的な操作(バイナリプラスを除く )は、 ` ToNumber ` 変換を行います:
177
+ - 数学的な操作(二項演算子プラスを除く )は、 ` ToNumber ` 変換を行います:
178
178
179
179
``` js run
180
180
let obj = {
@@ -186,7 +186,7 @@ alert(user + 500); // toString -> John500
186
186
alert (obj * 2 ); // 4, ToPrimitive は "2" を与えるので, 2 になります
187
187
```
188
188
189
- - バイナリプラスはプリミティブをチェックします -- もし文字列なら連結し、そうでなければ ` ToNumber` を行い、数値で処理をします。
189
+ - 二項演算子プラスはプリミティブをチェックします。 もし文字列なら連結し、そうでなければ ` ToNumber` を行い、数値で処理をします。
190
190
191
191
文字列の例:
192
192
` ` ` js run
@@ -210,8 +210,8 @@ alert(user + 500); // toString -> John500
210
210
alert(obj + 2); // 3 (ToPrimitive は boolean を返します, 文字列ではありません => ToNumber)
211
211
` ` `
212
212
213
- ` ` ` smart header="歴史的な注釈 "
214
- 歴史的な理由で、メソッド ` toString` または ` valueOf` はプリミティブを *返すべきです*: もしそれらがオブジェクトを返した場合、エラーにはなりませんがそのオブジェクトは無視されます(メソッドが存在しなかったかのように)。
213
+ ` ` ` smart header="歴史的な備考 "
214
+ 歴史的な理由で、メソッド ` toString` と ` valueOf` はプリミティブを *返すべきです*: もしそれらがオブジェクトを返した場合、エラーにはなりませんがそのオブジェクトは無視されます(メソッドが存在しなかったかのように)。
215
215
216
216
対象的に、` Symbol .toPrimitive ` はプリミティブを *返さなければいけません*、そうでなければエラーになります。
217
217
` ` `
@@ -220,20 +220,20 @@ alert(user + 500); // toString -> John500
220
220
221
221
オブジェクトからプリミティブへの変換は、値としてプリミティブを期待している多くの組み込みの関数や、操作によって自動的に呼び出されます。
222
222
223
- 3 つのタイプ (ヒント )があります:
223
+ 3 つのタイプ (hint )があります:
224
224
- ` "string"` (` alert` や、他の文字列変換のため)
225
- - ` "number"` (数学のため )
225
+ - ` "number"` (算術演算のため )
226
226
- ` "default"` (ほとんどありません)
227
227
228
228
229
- 仕様は、どの操作がどのヒントを使用するかを明示的に説明しています 。 " 期待するものがわからない" 演算子はほとんどなく、その場合は " デフォルト " のヒントを使用します。 通常、組み込みオブジェクトの場合、 ` "default"` ヒントは ` "number"` と同じように扱われるので、最後の 2 つはしばしば一緒にマージされます 。
229
+ 仕様は、どの操作がどの hint を使用するかを明示的に説明しています 。 " 期待するものがわからない" 演算子はほとんどなく、その場合は " default " のヒントを使用します。 通常、組み込みオブジェクトの場合、 ` "default"` ヒントは ` "number"` と同じように扱われるので、最後の 2 つはよく一緒にされます 。
230
230
231
231
変換のアルゴリズムは:
232
232
233
233
1. メソッドが存在する場合、` obj[Symbol.toPrimitive](hint)` を呼び出します
234
- 2. そうでない場合 、hint が ` "string"` であれば
234
+ 2. ない場合は 、hint が ` "string"` であれば
235
235
- ` obj.toString()` と ` obj.valueOf()` を試します。
236
236
3. そうでない場合、hint が ` "number"` であれば
237
237
- ` obj.valueOf()` と ` obj.toString()` を試します。
238
238
239
- 実際に、ロギングやデバッグ目的で、 " 人間が読める" オブジェクトの表現を返すすべての変換のための " キャッチオール " メソッドとしては、 ` obj.toString()` だけの実装で十分なことがしばしばです 。
239
+ 実際に、ロギングやデバッグ目的で " 人間が読める" オブジェクトの表現を返すような、 " あらゆる状況に対応できる " メソッドとしては、 ` obj.toString()` のみの実装で十分なことが多いです 。
0 commit comments