Skip to content

Commit 5a0b6d5

Browse files
committed
translation of article.md in Object to primitive conversion is done, according to #1 (comment)
1 parent 8647a17 commit 5a0b6d5

File tree

1 file changed

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

1 file changed

+90
-90
lines changed
Lines changed: 90 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,93 @@
11

2-
# Object to primitive conversion
2+
# Konversi objek menjadi *primitive*
33

4-
What happens when objects are added `obj1 + obj2`, subtracted `obj1 - obj2` or printed using `alert(obj)`?
4+
Apa yang terjadi ketika objek-objek ditamahkan `obj1 + obj2`, dikurangi `obj1 - obj2` atau dicetak menggunakan `alert(obj)`?
55

6-
In that case, objects are auto-converted to primitives, and then the operation is carried out.
6+
Dalam kasus itu, objek-objek secara otomatis dikonversi menjadi *primitive*, dan setelahnya operasi tersebut dilakukan.
77

8-
In the chapter <info:type-conversions> we've seen the rules for numeric, string and boolean conversions of primitives. But we left a gap for objects. Now, as we know about methods and symbols it becomes possible to fill it.
8+
Dalam bab <info:type-conversions> kita sudah tahu aturan-aturan untuk konversi numerik, *string* dan *boolean* dari *primitive*. Tetapi kita meninggalkan sebuah celah untuk objek. Kini, sebagaimana yang kita tahu tentang metode dan simbol, hal-hal tersebut memungkinkan kita untuk mengisi celah tersebut.
99

10-
1. All objects are `true` in a boolean context. There are only numeric and string conversions.
11-
2. The numeric conversion happens when we subtract objects or apply mathematical functions. For instance, `Date` objects (to be covered in the chapter <info:date>) can be subtracted, and the result of `date1 - date2` is the time difference between two dates.
12-
3. As for the string conversion -- it usually happens when we output an object like `alert(obj)` and in similar contexts.
10+
1. Semua objek adalah `true` dalam sebuah konteks *boolean*. Hanya ada konversi numerik dan *string* numerik saja.
11+
2. Konversi numerik terjadi ketika kita mengurangi objek atau menerapkan fungsi matermatika. Contohnya, objek `Date` (akan dibahas di bab <info:date>) dapat dikurangi, dan hasil dari `date1 - date2` adalah selisih waktu di antara kedua tanggal tersebut.
12+
3. Sedangkan untuk konversi *string* -- biasanya terjadi ketika kita mengeluarkan hasil sebuah objek seperti `alert(obj)` dan dalam konteks yang serupa.
1313

14-
## ToPrimitive
14+
## *ToPrimitive*
1515

16-
We can fine-tune string and numeric conversion, using special object methods.
16+
Kita dapat menyetel dengan baik konversi *string* dan konversi numerik, menggunakan metode-metode objek khusus.
1717

18-
There are three variants of type conversion, so-called "hints", described in the [specification](https://tc39.github.io/ecma262/#sec-toprimitive):
18+
Terdapat tiga varian konversi tipe (data), disebut juga
19+
"*hints*" ("petunjuk"), dideskripsikan dalam [spesifikasi](https://tc39.github.io/ecma262/#sec-toprimitive):
1920

2021
`"string"`
21-
: For an object-to-string conversion, when we're doing an operation on an object that expects a string, like `alert`:
22+
: untuk sebuah konversi objek-ke-string, ketika kita melakukan sebuah operasi pada sebuah objek yang diharapkan (menghasilkan) sebuah *string*, seperti `alert`:
2223

2324
```js
2425
// output
2526
alert(obj);
2627

27-
// using object as a property key
28+
// menggunakan objek sebagai properti kunci
2829
anotherObj[obj] = 123;
2930
```
3031

3132
`"number"`
32-
: For an object-to-number conversion, like when we're doing maths:
33+
: untuk sebuah konversi objk-ke-angka, seperti ketika kita melakukan (operasi) matematika:
3334

3435
```js
35-
// explicit conversion
36+
// konversi eksplisit
3637
let num = Number(obj);
3738

38-
// maths (except binary plus)
39+
// operasi matematika (kecuali biner tambah)
3940
let n = +obj; // unary plus
4041
let delta = date1 - date2;
4142

42-
// less/greater comparison
43+
// perbandingan lebih besar/lebih kecil
4344
let greater = user1 > user2;
4445
```
4546

4647
`"default"`
47-
: Occurs in rare cases when the operator is "not sure" what type to expect.
48+
: terjadi dalam kasus yang jarang ketika operator "tidak yakin" tipe (data) apa yang akan dihasilkan.
4849

49-
For instance, binary plus `+` can work both with strings (concatenates them) and numbers (adds them), so both strings and numbers would do. So if the a binary plus gets an object as an argument, it uses the `"default"` hint to convert it.
50+
Sebagai contohnya, (tanda) tambah biner `+` dapat bekerja dengan string (menggabungkannya) dan angka-angka (menambahkannya), jadi baik string dan angka tetap bisa dioperasikan. Jadi jika sebuah (tanda) tambah biner mendapatkan sebuah objek sebagai argumen, ia menggunakan petunjuk `"default"` untuk mengonversinya.
5051

51-
Also, if an object is compared using `==` with a string, number or a symbol, it's also unclear which conversion should be done, so the `"default"` hint is used.
52+
Dan juga, jika sebuah objek dibandingkan menggunakan `==` dengan sebuah string, angka atau sebuah simbol, hal tersebut juga tidak jelas mana konversi yang harus dilakukan, jadi digunakanlah petunjuk `"default"`.
5253

5354
```js
54-
// binary plus uses the "default" hint
55+
// (tanda) tambah biner menggunakan petunjuk "default" hint
5556
let total = obj1 + obj2;
5657

57-
// obj == number uses the "default" hint
58+
// obj == number menggunakan petunjuk "default"
5859
if (user == 1) { ... };
5960
```
6061

61-
The greater and less comparison operators, such as `<` `>`, can work with both strings and numbers too. Still, they use the `"number"` hint, not `"default"`. That's for historical reasons.
62+
Operator perbandingan lebih/semakin banyak dan lebih/semakin sedikit, seperti `<` `>`, dapat bekerja dengan string maupun angka. Namun tetap saja, operasi itu menggunakan petunjuk `"number"`, bukan `"default"`. Hal tersebut untuk alasan-alasan historis.
6263

63-
In practice though, we don't need to remember these peculiar details, because all built-in objects except for one case (`Date` object, we'll learn it later) implement `"default"` conversion the same way as `"number"`. And we can do the same.
64+
Dalam praktiknya, kita tidak perlu mengingat detil-detil ini, semua objek-objek bawaan (built-in) kecuali untuk satu kasus (objek `Date`, kita akan mempelajarinya nanti) mengimplementasi konversi `"default"` sama halnya dengan `"number"`. Dan kita akan melakukan hal yang sama.
6465

65-
```smart header="No `\"boolean\"` hint"
66-
Please note -- there are only three hints. It's that simple.
66+
```smart header="Tidak ada petunjuk `\"boolean\"` "
67+
Mohon diingat -- hanya ada tiga petunjuk. Sesederhana itu.```
6768

68-
There is no "boolean" hint (all objects are `true` in boolean context) or anything else. And if we treat `"default"` and `"number"` the same, like most built-ins do, then there are only two conversions.
69-
```
69+
Tidak ada petunjuk "boolean" (semua objek adalah `true` dalam konteks *boolean*) atau apapun itu. Dan jika kita memperlakukan `"default"` dan `"number"` dengan sama, seperti kebanyakkan bawaan lakukan, maka kemudian hanya ada dua konversi.
7070

7171
**To do the conversion, JavaScript tries to find and call three object methods:**
7272

73-
1. Call `obj[Symbol.toPrimitive](hint)` - the method with the symbolic key `Symbol.toPrimitive` (system symbol), if such method exists,
74-
2. Otherwise if hint is `"string"`
75-
- try `obj.toString()` and `obj.valueOf()`, whatever exists.
76-
3. Otherwise if hint is `"number"` or `"default"`
77-
- try `obj.valueOf()` and `obj.toString()`, whatever exists.
73+
1. Panggil `obj[Symbol.toPrimitive](hint)` - metode dengan kunci simbolik `Symbol.toPrimitive` (simbol sistem), jika metode demikian memang ada,
74+
2. Namun jika petunjuknya adalah `"string"`
75+
- cobalah `obj.toString()` atau `obj.valueOf()`, apapun yang ada.
76+
3. Namun jika petunjuknya adalah `"number"` atau `"default"`
77+
- cobalah `obj.valueOf()` dan `obj.toString()`, apapun yang ada.
7878

7979
## Symbol.toPrimitive
8080

81-
Let's start from the first method. There's a built-in symbol named `Symbol.toPrimitive` that should be used to name the conversion method, like this:
81+
Mari mulai dari metode pertama. Terdapat simbol bawaan yang bernama `Symbol.toPrimitive` yang digunakan untuk menamakan metode konversi, seperti ini:
8282

8383
```js
8484
obj[Symbol.toPrimitive] = function(hint) {
85-
// must return a primitive value
86-
// hint = one of "string", "number", "default"
85+
// harus mengembalikan sebuah nilai primitive
86+
// hint/petunjuk = salah satu antara "string", "number", "default"
8787
};
8888
```
8989

90-
For instance, here `user` object implements it:
90+
Sebagai contoh, di sini objek `user` mengimplementasikannya:
9191

9292
```js run
9393
let user = {
@@ -100,59 +100,59 @@ let user = {
100100
}
101101
};
102102

103-
// conversions demo:
104-
alert(user); // hint: string -> {name: "John"}
105-
alert(+user); // hint: number -> 1000
106-
alert(user + 500); // hint: default -> 1500
103+
// demonstrasi konversi:
104+
alert(user); // hint/petunjuk: string -> {name: "John"}
105+
alert(+user); // hint/petunjuk: number -> 1000
106+
alert(user + 500); // hint/petunjuk: default -> 1500
107107
```
108108

109-
As we can see from the code, `user` becomes a self-descriptive string or a money amount depending on the conversion. The single method `user[Symbol.toPrimitive]` handles all conversion cases.
109+
Seperti yang bisa kita lihat dari kode tersebut, `user` menjadi sebuah *string* yang *self-descriptive* (menggambarkan dirinya sendiri) atau sejumlah uang tergantung dari konversinya. Metode tunggal `user[Symbol.toPrimitive]` tersebut menangani semua kasus konversi.
110110

111111

112112
## toString/valueOf
113113

114-
Methods `toString` and `valueOf` come from ancient times. They are not symbols (symbols did not exist that long ago), but rather "regular" string-named methods. They provide an alternative "old-style" way to implement the conversion.
114+
Metode-metode `toString` dan `valueOf` berasal dari zaman dulu. Metode-metode tersebut bukanlah simbol (simbol belum ada waktu itu), melainkan metode-metode "reguler" yang dinamakan (dengan) *string*. Kedua metode itu menyediakan sebuah cara alternatif "gaya lawas" untuk mengimplementasikan konversi.
115115

116-
If there's no `Symbol.toPrimitive` then JavaScript tries to find them and try in the order:
116+
Jika tidak ada `Symbol.toPrimitive` maka JavaScript mencoba untuk menemukan metode tersebut dan mencoba keduanya dengan urutan:
117117

118-
- `toString -> valueOf` for "string" hint.
119-
- `valueOf -> toString` otherwise.
118+
- `toString -> valueOf` untuk petunjuk "string".
119+
- `valueOf -> toString` jika sebaliknya.
120120

121-
These methods must return a primitive value. If `toString` or `valueOf` returns an object, then it's ignored (same as if there were no method).
121+
Dua metode ini harus mengembalikan sebuah nilai *primitive*. Jika `toString` atau `valueOf` mengembalikan sebuah objek, maka objek tersebut diabaikan (sama halnya jika tidak ada metode).
122122

123-
By default, a plain object has following `toString` and `valueOf` methods:
123+
Secara mendasar (standar), sebuah objek polos memiliki metode `toString` dan `valueOf` berikut ini:
124124

125-
- The `toString` method returns a string `"[object Object]"`.
126-
- The `valueOf` method returns the object itself.
125+
- Metode `toString` mengembalikan sebuah *string* `"[object Object]"`.
126+
- Metode `valueOf` mengembalikan objek itu sendiri.
127127

128-
Here's the demo:
128+
Berikut ini contohnya:
129129

130130
```js run
131131
let user = {name: "John"};
132132

133-
alert(user); // [object Object]
133+
alert(user); // [objek Object]
134134
alert(user.valueOf() === user); // true
135135
```
136136

137-
So if we try to use an object as a string, like in an `alert` or so, then by default we see `[object Object]`.
137+
Jadi jika kita coba untuk menggunakan sebuah objek sebagai sebuah *string*, seperti dalam sebuah `alert` atau sejenisnya, maka secara standar kita melihat `[object Object]`.
138138

139-
And the default `valueOf` is mentioned here only for the sake of completeness, to avoid any confusion. As you can see, it returns the object itself, and so is ignored. Don't ask me why, that's for historical reasons. So we can assume it doesn't exist.
139+
Dan standar dari `valueOf` disebutkan di sini hanya demi tujuan melengkapi saja, untuk menghindari kebingungan. Seperti yang bisa dilihat, metode tesebut mengembalikan objeknya sendiri, dan juga mengabaikannya. Jangan tanya mengapa demikian, itulah alasan-alasan historisnya. Jadi kita anggap hal tersebut tidak ada.
140140

141-
Let's implement these methods.
141+
Mari implementasikan metode-metode berikut ini.
142142

143-
For instance, here `user` does the same as above using a combination of `toString` and `valueOf` instead of `Symbol.toPrimitive`:
143+
Sebagai contoh, di sini `user` melakukan hal yag sama seperti di atas menggunakan sebuah kombinasi `toString` serta `valueOf` ketimbang menggunakan `Symbol.toPrimitive`:
144144

145145
```js run
146146
let user = {
147147
name: "John",
148148
money: 1000,
149149

150-
// for hint="string"
150+
// untuk hint/petunjuk="string"
151151
toString() {
152152
return `{name: "${this.name}"}`;
153153
},
154154

155-
// for hint="number" or "default"
155+
// untuk hint/petunjuk="number" atau "default"
156156
valueOf() {
157157
return this.money;
158158
}
@@ -164,9 +164,9 @@ alert(+user); // valueOf -> 1000
164164
alert(user + 500); // valueOf -> 1500
165165
```
166166

167-
As we can see, the behavior is the same as the previous example with `Symbol.toPrimitive`.
167+
Seperti yang bisa kita lihat, perilaku tersebut sama dengan contoh sebelumnya dengan menggunakan `Symbol.toPrimitive`.
168168

169-
Often we want a single "catch-all" place to handle all primitive conversions. In this case, we can implement `toString` only, like this:
169+
Seringkali kita ingin sebuah wadah tunggal yang "menangkap semua" untuk menangani semua konversi *primitive*. Dalam kasus ini, kita bisa mengimplementasikan `toString` saja, seperti berikut ini:
170170

171171
```js run
172172
let user = {
@@ -181,47 +181,47 @@ alert(user); // toString -> John
181181
alert(user + 500); // toString -> John500
182182
```
183183

184-
In the absence of `Symbol.toPrimitive` and `valueOf`, `toString` will handle all primitive conversions.
184+
Dalam ketidakberadaan `Symbol.toPrimitive` dan `valueOf`, `toString` akan menangani semua konversi *primitive*.
185185

186-
## Return types
186+
## Tipe *return* (kembalian)
187187

188-
The important thing to know about all primitive-conversion methods is that they do not necessarily return the "hinted" primitive.
188+
Hal penting yang harus diketahui tentang semua metode-metode konversi ke-*primitive* adalah bahwa metode-metode tersebut tidak selalu mengembalikan *primitive* "yang diberikan petunjuk".
189189

190-
There is no control whether `toString` returns exactly a string, or whether `Symbol.toPrimitive` method returns a number for a hint `"number"`.
190+
Tidak ada kendali apakah `toString` mengembalikan tepat sebuah *string*, atau apakah metode `Symbol.toPrimitive` mengembalikan sebuah angka untuk petunjuk `"number"`.
191191

192-
The only mandatory thing: these methods must return a primitive, not an object.
192+
Satu-satunya hal wajib adalah: metode-metode ini harus mengembalikan sebuah *primitive*, bukan sebuah objek.
193193

194194
```smart header="Historical notes"
195195
For historical reasons, if `toString` or `valueOf` returns an object, there's no error, but such value is ignored (like if the method didn't exist). That's because in ancient times there was no good "error" concept in JavaScript.
196196
197197
In contrast, `Symbol.toPrimitive` *must* return a primitive, otherwise there will be an error.
198198
```
199199

200-
## Further conversions
200+
## Konversi lebih jauh
201201

202-
As we know already, many operators and functions perform type conversions, e.g. multiplication `*` converts operands to numbers.
202+
Seperti yang kita sudah tahu, banyak operator dan fungsi melakukan konversi-konversi tipe (data), misal perkalian `*` mengonversi *operand* menjadi angka-angka.
203203

204-
If we pass an object as an argument, then there are two stages:
205-
1. The object is converted to a primitive (using the rules described above).
206-
2. If the resulting primitive isn't of the right type, it's converted.
204+
Jika kita mengoper sebuah objek sebagai sebuah argumen, maka terdapat dua tahap:
205+
1. Objek tersebut dikonversi ke sebuah *primitive* (menggunakan aturan-aturan dideskripsikan di atas).
206+
2. Jika menghasilkan *primitive* dari tipe (data) yang tidak tepat, makan itu dikonversikan.
207207

208-
For instance:
208+
Contohnya:
209209

210210
```js run
211211
let obj = {
212-
// toString handles all conversions in the absence of other methods
212+
// toString menangani semua konversi selama tidak ada metode lain
213213
toString() {
214214
return "2";
215215
}
216216
};
217217

218-
alert(obj * 2); // 4, object converted to primitive "2", then multiplication made it a number
218+
alert(obj * 2); // 4, objek dikonversi jadi primitive "2", kemudian perkalian membuatnya menjadi sebuah angka
219219
```
220220

221-
1. The multiplication `obj * 2` first converts the object to primitive (that's a string `"2"`).
222-
2. Then `"2" * 2` becomes `2 * 2` (the string is converted to number).
221+
1. Perkalian `obj * 2` pertama mengonversi objek menjadi primitive (yakni sebuah *string* `"2"`).
222+
2. Lalu `"2" * 2` menjadi `2 * 2` (*string* dikonversi menjadi angka).
223223

224-
Binary plus will concatenate strings in the same situation, as it gladly accepts a string:
224+
(Tanda) tambah biner akan merentetkan/merangkai *string* dalam situasi yang sama, selama operasi tersebut menerima sebuah *string*:
225225

226226
```js run
227227
let obj = {
@@ -230,26 +230,26 @@ let obj = {
230230
}
231231
};
232232

233-
alert(obj + 2); // 22 ("2" + 2), conversion to primitive returned a string => concatenation
233+
alert(obj + 2); // 22 ("2" + 2), konversi ke primitive mengembalikan sebuah string => perentetan (concatenation)
234234
```
235235

236-
## Summary
236+
## Ringkasan
237237

238-
The object-to-primitive conversion is called automatically by many built-in functions and operators that expect a primitive as a value.
238+
Konversi objek-ke-primitive secara otomatis dipanggil oleh banyak fungsi-fungsi serta operator bawaan (*built-in*) yang mengharapkan hasil *primitive* sebagai sebuah nilai.
239239

240-
There are 3 types (hints) of it:
241-
- `"string"` (for `alert` and other operations that need a string)
242-
- `"number"` (for maths)
243-
- `"default"` (few operators)
240+
Terdapat 3 tipe (*hint*) di situ:
241+
- `"string"` (untuk `alert` dan operasi lain yang membutuhkan sebuah *string*)
242+
- `"number"` (untuk matematika)
243+
- `"default"` (beberapa operator)
244244

245-
The specification describes explicitly which operator uses which hint. There are very few operators that "don't know what to expect" and use the `"default"` hint. Usually for built-in objects `"default"` hint is handled the same way as `"number"`, so in practice the last two are often merged together.
245+
Spesifikasi tersebut mendeskripsikan secara eksplisit operator mana yang menggunakan petunjuk (*hint*) yang mana. Sangat sedikit operator yang "tidak tahu untuk memperkirakan/menghasilkan (tipe) apa" dan menggunakan petunjuk `"default"`. Biasanya petunjuk `"default"` objek-objek bawaan ditangani sama seperti `"number"`, jadi pada latihan - dua hal terakhir itu sering kali dijadikan satu bersamaan.
246246

247-
The conversion algorithm is:
247+
Konversi algoritma tersebut yakni:
248248

249-
1. Call `obj[Symbol.toPrimitive](hint)` if the method exists,
250-
2. Otherwise if hint is `"string"`
251-
- try `obj.toString()` and `obj.valueOf()`, whatever exists.
252-
3. Otherwise if hint is `"number"` or `"default"`
253-
- try `obj.valueOf()` and `obj.toString()`, whatever exists.
249+
1. Memanggil `obj[Symbol.toPrimitive](hint)` jika metodenya ada,
250+
2. Sebaliknya jika petunjuknya adalah `"string"`
251+
- cobalah `obj.toString()` dan `obj.valueOf()`, apapun yang ada.
252+
3. Selain kondisi di atas jika petunjuknya adalah `"number"` atau `"default"`
253+
- coba `obj.valueOf()` dan `obj.toString()`, atau apapun yang ada.
254254

255-
In practice, it's often enough to implement only `obj.toString()` as a "catch-all" method for all conversions that return a "human-readable" representation of an object, for logging or debugging purposes.
255+
Dalam latihan, cukup sering untuk mengimplementasikan `obj.toString()` saja sebagai sebuah metode yang "menangkap semuanya" untuk semua konversi yang mengembalikan sebuah representasi sebuah objek yang "mudah dibaca manusia", untuk tujuan-tujuan pencatatan serta *debugging*.

0 commit comments

Comments
 (0)