Skip to content

Commit 30cbb64

Browse files
committed
review - object-toprimitive
1 parent 6fc8038 commit 30cbb64

File tree

1 file changed

+42
-42
lines changed
  • 1-js/04-object-basics/05-object-toprimitive

1 file changed

+42
-42
lines changed

1-js/04-object-basics/05-object-toprimitive/article.md

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
11

22
# オブジェクトからプリミティブへの変換
33

4-
オブジェクトが加算 `obj1 + obj2`、減算 `obj1 - obj2`, または `alert(obj)` を使って出力されたとき何が起きるでしょう
4+
オブジェクトが加算 `obj1 + obj2`、減算 `obj1 - obj2`, または `alert(obj)` を使って出力されるとき、何が起きるでしょう
55

66
オブジェクトには、変換を行う特別なメソッドがあります。
77

8-
チャプター <info:type-conversions> で、私たちは、プリミティブな数値、文字列や真偽値変換のルールを見てきました。しかしオブジェクトへのギャップが残っています。ここまでで、我々はメソッドとシンボルについて学んだので、それを閉じることができます
8+
チャプター <info:type-conversions> では、プリミティブな数値、文字列や真偽値変換のルールを見てきました。しかしまだオブジェクトが残っています。ここまでのチュートリアルでメソッドとシンボルについて学んだので、今ならそれらを理解することができます
99

1010
[cut]
1111

12-
オブジェクトの場合、すべてのオブジェクトは真偽値コンテキストでは `true` なので、真偽値への変換はありません。従って、文字列と数値変換だけです。
12+
オブジェクトの場合、すべてのオブジェクトは真偽値のコンテキストでは `true` になるため、真偽値への変換はありません。そのため、文字列と数値変換だけです。
1313

14-
数値変換は、オブジェクトを減算する、もしくは数学的な関数を適用する時に起こります。例えば `Date` オブジェクト(チャプター <info:date> で説明されています)は減算することができ、 `date1 - date2` の結果は2つの日付間の時間差になります。
14+
数値変換は、オブジェクトを減算したり数学的な関数を適用する時に発生します。例えば `Date` オブジェクト(チャプター <info:date> で説明されています)は減算することができ、 `date1 - date2` の結果は2つの日付間の時間差になります。
1515

1616
文字列変換はどうかというと -- 通常、`alert(obj)` のようにオブジェクトを出力したり、似たようなコンテキストのときに起こります。
1717

1818
## ToPrimitive
1919

20-
プリミティブが必要とされるコンテキストでオブジェクトが使われる場合、例えば `alert` や数学的な操作`ToPrimitive` アルゴリズム([スペック](https://tc39.github.io/ecma262/#sec-toprimitive))を使ってプリミティブ値に変換されます。
20+
プリミティブが必要とされるコンテキストでオブジェクトが使われる場合、例えば `alert` や数学的な操作と言ったような場合`ToPrimitive` アルゴリズム([スペック](https://tc39.github.io/ecma262/#sec-toprimitive))を使ってプリミティブ値に変換されます。
2121

22-
そのアルゴリズムによって、特別なオブジェクトメソッドを使って変換をカスタマイズすることができます。
22+
そのアルゴリズムは、特別なオブジェクトメソッドを使って変換をカスタマイズすることができます。
2323

24-
コンテキストに応じて、変換にはいわゆる "ヒント" があります。
24+
コンテキストに応じて、変換にはいわゆる "hint" があります。
2525

26-
3つのバリアントがあります:
26+
3つのケースがあります:
2727

2828
`"string"`
29-
: 操作が `alert` のように文字列を期待するとき -- オブジェクトから文字列への変換:
29+
: 操作が `alert` のように文字列を期待するとき -- オブジェクトから文字列への変換をします:
3030

3131
```js
3232
// 出力
@@ -37,7 +37,7 @@
3737
```
3838

3939
`"number"`
40-
: 操作が数学のように数値を期待するとき -- オブジェクトから数値への変換:
40+
: 操作が数学のように数値を期待するとき -- オブジェクトから数値への変換をします:
4141

4242
```js
4343
// 明示的な変換
@@ -54,33 +54,33 @@
5454
`"default"`
5555
: 操作がどんな型を期待しているか "よくわからない" ようなレアケースで起こります
5656

57-
例えば、バイナリプラス `+` は文字列(それらを連結します)と数値(それらを足します)両方で動作するので、文字列と数値の両方が有りえます。または、オブジェクトが `==` を使用して、文字列、数値またはシンボルと比較されるときです。
57+
例えば、二項演算子 `+` は文字列(それらの連結)と数値(それらの加算)両方で動作するので、文字列と数値の両方の場合がありえます。または、オブジェクトが `==` を使用して、文字列、数値またはシンボルと比較されるときです。
5858

5959
```js
60-
// バリナリプラス
60+
// 二項演算子 +
6161
let total = car1 + car2;
6262

6363
// obj == string/number/symbol
6464
if (user == 1) { ... };
6565
```
6666

67-
より大きい/小さい演算子 `<>` もまた文字列と数字両方を扱うことができますが、これは "default" ではなく "number" を使います。これは歴史的な理由によるものです。
67+
より大なり/小なり演算子 `<>` もまた文字列と数字両方を扱うことができますが、これは "default" ではなく "number" を使います。これは歴史的な理由によるものです。
6868

69-
実際には、1つのケース(`Date` オブジェクトです。後ほど学びます)を除くすべての組み込みオブジェクトは `"number"` と同じ方法で `"default"` 変換を実装しています。そして、恐らく私たちは同じようにするべきです
69+
実際には、1つのケース(`Date` オブジェクトの場合です。後ほど学びます)を除くすべての組み込みオブジェクトは `"number"` `"default"` 変換は同じ方法で実装されています。そして、恐らく私たちも同じようにするべきです
7070

71-
留意してください -- 3つだけ ヒント があります。それはシンプルです。 "真偽値" の ヒント はありません(真偽値のコンテキストにおいては、すべてのオブジェクトは `true` です)。そして、ほとんどの組み込みのように、もし `"default"``"number"` を同じように扱うと、2つの変換しかありません
71+
留意してください -- 3つだけ hint があり、それはシンプルです。 "真偽値" はありません(真偽値のコンテキストにおいては、すべてのオブジェクトは `true` です)。そして、ほとんどの組み込みのように、`"default"``"number"` を同じように扱うと、変換は2つしかありません
7272

7373
**変換をするために、JavaScriptは3つのオブジェクトのメソッドを見つけ呼び出そうとします。**
7474

7575
1. メソッドが存在する場合、`obj[Symbol.toPrimitive](hint)` を呼び出します
76-
2. そうでない場合、hint が `"string"` であれば
76+
2. ない場合、hint が `"string"` であれば
7777
- `obj.toString()``obj.valueOf()` を試します。
78-
3. そうでない場合、hint が `"number"` であれば
78+
3. そうでなく、hint が `"number"` であれば
7979
- `obj.valueOf()``obj.toString()` を試します。
8080

8181
## Symbol.toPrimitive
8282

83-
最初のメソッドから始めてみましょう。`Symbol.toPrimitive` という名前の組み込みシンボルがあります。このシンボルは、次のように変換メソッドに名前を付けるために使用します
83+
最初のメソッドから始めてみましょう。`Symbol.toPrimitive` という名前の組み込みシンボルがあります。このシンボルは、次のように変換メソッドの名前として使用します
8484

8585
```js
8686
obj[Symbol.toPrimitive] = function(hint) {
@@ -89,7 +89,7 @@ obj[Symbol.toPrimitive] = function(hint) {
8989
}
9090
```
9191

92-
例えば、ここで `user` オブジェクトはそれを実装しています:
92+
例えば、これは `Symbol.toPrimitive` を実装した `user` オブジェクトです:
9393

9494
```js run
9595
let user = {
@@ -102,37 +102,37 @@ let user = {
102102
}
103103
};
104104

105-
// 変換デモo:
105+
// 変換動作の確認:
106106
alert(user); // hint: string -> {name: "John"}
107107
alert(+user); // hint: number -> 1000
108108
alert(user + 500); // hint: default -> 1500
109109
```
110110

111-
コードから分かるように、`user` は変換に応じて、自己記述的な文字列、または金額になります。1つのメソッド `user[Symbol.toPrimitive]` がすべての変換ケースを扱います
111+
コードから分かるように、`user` は変換に応じて、文字列または金額になります。1つのメソッド `user[Symbol.toPrimitive]` がすべての変換ケースを扱っています
112112

113113

114114
## toString/valueOf
115115

116-
メソッド `toString``valueOf` は古代から来ています。それらはシンボルではなく(シンボルはずっと前には存在しませんでした)が、"通常の" 文字列で名前付けされたメソッドです。それらは変換を実装するための代替の "古いスタイル" の方法を提供します。
116+
メソッド `toString``valueOf` は古代からあります。それらはシンボルではなく(シンボルはずっと前には存在しませんでした)が、"通常の" 文字列で名前付けされたメソッドです。それらは変換を行うための代替の "古いスタイル" の方法を提供します。
117117

118-
もしも、`Symbol.toPrimitive` がない場合、JavaScriptはそれらを見つけ、次の順でトライします:
118+
`Symbol.toPrimitive` がない場合、JavaScriptはそれらを見つけ、次の順でトライします:
119119

120-
- `toString -> valueOf` "string" hint のために.
121-
- `valueOf -> toString` そうでない場合.
120+
- `toString -> valueOf` "string" hint の場合
121+
- `valueOf -> toString` そうでない場合
122122

123-
例えば、ここで `user``toString``valueOf` をあわせて使って上と同じことをしています:
123+
例えば、ここで `user``toString``valueOf` を使って上と同じことをしています:
124124

125125
```js run
126126
let user = {
127127
name: "John",
128128
money: 1000,
129129

130-
// for hint="string"
130+
// hint="string" の場合
131131
toString() {
132132
return `{name: "${this.name}"}`;
133133
},
134134

135-
// for hint="number" or "default"
135+
// hint="number" or "default" の場合
136136
valueOf() {
137137
return this.money;
138138
}
@@ -144,7 +144,7 @@ alert(+user); // valueOf -> 1000
144144
alert(user + 500); // valueOf -> 1500
145145
```
146146

147-
多くの場合、すべてのプリミティブ変換を処理する単一の "すべてのキャッチ" が必要です。 この場合、次のように `toString`だけを実装することで実現できます:
147+
多くの場合、すべてのプリミティブ変換が処理できる "あらゆる状況に対応できる場所" が必要です。 この場合、次のように `toString` を実装するだけで実現できます:
148148

149149
```js run
150150
let user = {
@@ -164,17 +164,17 @@ alert(user + 500); // toString -> John500
164164

165165
## ToPrimitive と ToString/ToNumber
166166

167-
すべてのプリミティブ変換メソッドを知るのに重要なことは、それらは必ずしも "ほのめかされた" プリミティブを返さないことです
167+
すべてのプリミティブ変換メソッドについて知っておくべき重要なことは、それらが必ずしも "hint" のプリミティブを返すわけではないということです
168168

169-
`toString()` が正しく文字列を返すか、もしくは `Symbol.toPrimitive` メソッドが "number" のヒントで数値を返すかはコントロール出来ません
169+
`toString()` が正しく文字列を返すか、もしくは `Symbol.toPrimitive` メソッドが "number" の hint で数値を返すかはコントロールできません
170170

171-
**唯一の必須なこと: それらのメソッドはプリミティブを返す必要があります**
171+
**唯一の必須事項は、これらのメソッドはプリミティブを返す必要がある、ということです**
172172

173-
変換が開始された操作では、そのプリミティブが取得され、引き続き処理が行われます。必要に応じてさらに変換が適用されます
173+
変換が行われるとプリミティブが返却され、その後引き続き処理が行われます。必要に応じてさらに変換が行われます
174174

175175
例えば:
176176

177-
- 数学的な操作(バイナリプラスを除く)は、 `ToNumber` 変換を行います:
177+
- 数学的な操作(二項演算子プラスを除く)は、 `ToNumber` 変換を行います:
178178

179179
```js run
180180
let obj = {
@@ -186,7 +186,7 @@ alert(user + 500); // toString -> John500
186186
alert(obj * 2); // 4, ToPrimitive は "2" を与えるので, 2 になります
187187
```
188188

189-
- バイナリプラスはプリミティブをチェックします -- もし文字列なら連結し、そうでなければ `ToNumber` を行い、数値で処理をします。
189+
- 二項演算子プラスはプリミティブをチェックします。もし文字列なら連結し、そうでなければ `ToNumber` を行い、数値で処理をします。
190190

191191
文字列の例:
192192
```js run
@@ -210,8 +210,8 @@ alert(user + 500); // toString -> John500
210210
alert(obj + 2); // 3 (ToPrimitive は boolean を返します, 文字列ではありません => ToNumber)
211211
```
212212

213-
```smart header="歴史的な注釈"
214-
歴史的な理由で、メソッド `toString` または `valueOf` はプリミティブを *返すべきです*: もしそれらがオブジェクトを返した場合、エラーにはなりませんがそのオブジェクトは無視されます(メソッドが存在しなかったかのように)。
213+
```smart header="歴史的な備考"
214+
歴史的な理由で、メソッド `toString` `valueOf` はプリミティブを *返すべきです*: もしそれらがオブジェクトを返した場合、エラーにはなりませんがそのオブジェクトは無視されます(メソッドが存在しなかったかのように)。
215215
216216
対象的に、`Symbol.toPrimitive` はプリミティブを *返さなければいけません*、そうでなければエラーになります。
217217
```
@@ -220,20 +220,20 @@ alert(user + 500); // toString -> John500
220220

221221
オブジェクトからプリミティブへの変換は、値としてプリミティブを期待している多くの組み込みの関数や、操作によって自動的に呼び出されます。
222222

223-
3つのタイプ (ヒント)があります:
223+
3つのタイプ (hint)があります:
224224
- `"string"` (`alert` や、他の文字列変換のため)
225-
- `"number"` (数学のため)
225+
- `"number"` (算術演算のため)
226226
- `"default"` (ほとんどありません)
227227

228228

229-
仕様は、どの操作がどのヒントを使用するかを明示的に説明しています"期待するものがわからない" 演算子はほとんどなく、その場合は "デフォルト" のヒントを使用します。 通常、組み込みオブジェクトの場合、 `"default"` ヒントは `"number"` と同じように扱われるので、最後の2つはしばしば一緒にマージされます
229+
仕様は、どの操作がどの hint を使用するかを明示的に説明しています"期待するものがわからない" 演算子はほとんどなく、その場合は "default" のヒントを使用します。 通常、組み込みオブジェクトの場合、 `"default"` ヒントは `"number"` と同じように扱われるので、最後の2つはよく一緒にされます
230230

231231
変換のアルゴリズムは:
232232

233233
1. メソッドが存在する場合、`obj[Symbol.toPrimitive](hint)` を呼び出します
234-
2. そうでない場合、hint が `"string"` であれば
234+
2. ない場合は、hint が `"string"` であれば
235235
- `obj.toString()``obj.valueOf()` を試します。
236236
3. そうでない場合、hint が `"number"` であれば
237237
- `obj.valueOf()``obj.toString()` を試します。
238238

239-
実際に、ロギングやデバッグ目的で"人間が読める" オブジェクトの表現を返すすべての変換のための "キャッチオール" メソッドとしては、 `obj.toString()` だけの実装で十分なことがしばしばです
239+
実際に、ロギングやデバッグ目的で "人間が読める" オブジェクトの表現を返すような、 "あらゆる状況に対応できる" メソッドとしては、 `obj.toString()` のみの実装で十分なことが多いです

0 commit comments

Comments
 (0)