You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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)`?
5
5
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.
7
7
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.
9
9
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.
13
13
14
-
## ToPrimitive
14
+
## *ToPrimitive*
15
15
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.
17
17
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):
19
20
20
21
`"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`:
22
23
23
24
```js
24
25
// output
25
26
alert(obj);
26
27
27
-
// using object as a property key
28
+
// menggunakan objek sebagai properti kunci
28
29
anotherObj[obj] = 123;
29
30
```
30
31
31
32
`"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:
33
34
34
35
```js
35
-
// explicit conversion
36
+
// konversi eksplisit
36
37
let num = Number(obj);
37
38
38
-
// maths (except binary plus)
39
+
// operasi matematika (kecuali biner tambah)
39
40
let n = +obj; // unary plus
40
41
let delta = date1 - date2;
41
42
42
-
// less/greater comparison
43
+
// perbandingan lebih besar/lebih kecil
43
44
let greater = user1 > user2;
44
45
```
45
46
46
47
`"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.
48
49
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.
50
51
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"`.
52
53
53
54
```js
54
-
// binary plus uses the "default" hint
55
+
// (tanda) tambah biner menggunakan petunjuk "default" hint
55
56
let total = obj1 + obj2;
56
57
57
-
// obj == number uses the "default" hint
58
+
// obj == number menggunakan petunjuk "default"
58
59
if (user == 1) { ... };
59
60
```
60
61
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.
62
63
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.
64
65
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.```
67
68
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.
70
70
71
71
**To do the conversion, JavaScript tries to find and call three object methods:**
72
72
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.
78
78
79
79
## Symbol.toPrimitive
80
80
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:
82
82
83
83
```js
84
84
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"
87
87
};
88
88
```
89
89
90
-
For instance, here `user`object implements it:
90
+
Sebagai contoh, di sini objek `user`mengimplementasikannya:
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.
110
110
111
111
112
112
## toString/valueOf
113
113
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.
115
115
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:
117
117
118
-
-`toString -> valueOf`for "string" hint.
119
-
-`valueOf -> toString`otherwise.
118
+
-`toString -> valueOf`untuk petunjuk "string".
119
+
-`valueOf -> toString`jika sebaliknya.
120
120
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).
122
122
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:
124
124
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.
127
127
128
-
Here's the demo:
128
+
Berikut ini contohnya:
129
129
130
130
```js run
131
131
let user = {name:"John"};
132
132
133
-
alert(user); // [object Object]
133
+
alert(user); // [objek Object]
134
134
alert(user.valueOf() === user); // true
135
135
```
136
136
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]`.
138
138
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.
140
140
141
-
Let's implement these methods.
141
+
Mari implementasikan metode-metode berikut ini.
142
142
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`:
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`.
168
168
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:
170
170
171
171
```js run
172
172
let user = {
@@ -181,47 +181,47 @@ alert(user); // toString -> John
181
181
alert(user +500); // toString -> John500
182
182
```
183
183
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*.
185
185
186
-
## Return types
186
+
## Tipe *return* (kembalian)
187
187
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".
189
189
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"`.
191
191
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.
193
193
194
194
```smart header="Historical notes"
195
195
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.
196
196
197
197
In contrast, `Symbol.toPrimitive` *must* return a primitive, otherwise there will be an error.
198
198
```
199
199
200
-
## Further conversions
200
+
## Konversi lebih jauh
201
201
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.
203
203
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.
207
207
208
-
For instance:
208
+
Contohnya:
209
209
210
210
```js run
211
211
let obj = {
212
-
// toString handles all conversions in the absence of other methods
212
+
// toString menangani semua konversi selama tidak ada metode lain
213
213
toString() {
214
214
return"2";
215
215
}
216
216
};
217
217
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
219
219
```
220
220
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).
223
223
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*:
225
225
226
226
```js run
227
227
let obj = {
@@ -230,26 +230,26 @@ let obj = {
230
230
}
231
231
};
232
232
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)
234
234
```
235
235
236
-
## Summary
236
+
## Ringkasan
237
237
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.
239
239
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)
244
244
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.
246
246
247
-
The conversion algorithm is:
247
+
Konversi algoritma tersebut yakni:
248
248
249
-
1.Call`obj[Symbol.toPrimitive](hint)`if the method exists,
-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.
254
254
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