Skip to content

Commit 3f811c6

Browse files
authored
Merge branch 'master' into abdmmar-branch
2 parents 021166e + 7729c97 commit 3f811c6

File tree

80 files changed

+2256
-1907
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+2256
-1907
lines changed

1-js/01-getting-started/1-intro/article.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,15 @@ Browser punya engine yang tertanam didalamnya yang disebut "JavaScript virtual m
2424

2525
Tiap engine punya *codename*-nya sendiri. Misalnya:
2626

27+
<<<<<<< HEAD
2728
- [V8](https://en.wikipedia.org/wiki/V8_(JavaScript_engine)) -- di Chrome dan Opera.
2829
- [SpiderMonkey](https://en.wikipedia.org/wiki/SpiderMonkey) -- di Firefox.
2930
- ...Ada juga codename lain seperti "Trident" dan "Chakra" untuk versi berbeda dari IE, "ChakraCore" untuk Microsoft Edge, "Nitro" dan "SquirrelFish" untuk Safari, dll.
31+
=======
32+
- [V8](https://en.wikipedia.org/wiki/V8_(JavaScript_engine)) -- in Chrome and Opera.
33+
- [SpiderMonkey](https://en.wikipedia.org/wiki/SpiderMonkey) -- in Firefox.
34+
- ...There are other codenames like "Chakra" for IE, "ChakraCore" for Microsoft Edge, "Nitro" and "SquirrelFish" for Safari, etc.
35+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
3036
3137
Istilah di atas sebaiknya diingat karena akan sering digunakan dalam artikel para developer di internet. Kita akan menggunakannya juga. Misalnya, jika "fitur X didukung V8", kemungkinan ia bisa jalan di Chrome dan Opera.
3238

1-js/02-first-steps/05-types/article.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,23 @@ const bigInt = 1234567890123456789012345678901234567890n;
8181

8282
Sebenarnya `BigInt` jarang dibutuhkan, kita tidak akan mempelajarinya disini, tetapi akan dipisahkan didalam bagian <info:bigint>. Baca saja saat kamu membutuhkan nilai *integer* yang sangat panjang.
8383

84+
<<<<<<< HEAD
8485
<<<<<<< HEAD
8586
```smart header="Masalah Kompabilitas"
8687
Sekarang `BigInt` sudah didukung oleh Firefox/Chrome/Edge, tapi tidak didalam Safari/Internet Explorer.
8788
=======
8889
```smart header="Compatibility issues"
8990
Right now `BigInt` is supported in Firefox/Chrome/Edge, but not in Safari/IE.
9091
>>>>>>> f830bc5d9454d85829e011d914f215eb5896579a
92+
=======
93+
94+
```smart header="Compatibility issues"
95+
Right now, `BigInt` is supported in Firefox/Chrome/Edge/Safari, but not in IE.
96+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
9197
```
9298

99+
You can check [*MDN* BigInt compatibility table](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility) to know which versions of a browser are supported.
100+
93101
## String
94102

95103
String di JavaScript harus dikelilingi petik.

1-js/02-first-steps/08-operators/4-fix-prompt/solution.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ let b = "2"; // prompt("Angka kedua?", 2);
99
alert(a + b); // 12
1010
```
1111

12+
<<<<<<< HEAD
1213
<<<<<<< HEAD
1314
Apa yang kita harus lakukan untuk mengubah string menjadi angka sebelum `+`, gunakan `Number()` atau menambahkannya dengan `+`.
1415
=======
1516
What we should do is to convert strings to numbers before `+`. For example, using `Number()` or
1617
prepending them with `+`.
1718
>>>>>>> ff152b126ec70a9de919bfdc1913215539d37187
19+
=======
20+
What we should do is to convert strings to numbers before `+`. For example, using `Number()` or prepending them with `+`.
21+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
1822
1923
Contoh, tepat sebelum `prompt`:
2024

1-js/02-first-steps/08-operators/article.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,11 @@ Tanda kurung mengesampingkan presedensi apapun, jadi jika kita tak puas dengan u
183183

184184
Ada banyak operator di JavaScript. Tiap operator punya nomor presedensi masing-masing. Nomor yang lebih besar dieksekusi terlebih dahulu. Jika presedensinya sama, urutan eksekusinya dari kiri ke kanan.
185185

186+
<<<<<<< HEAD
186187
Di sini adalah extrak dari [tabel presedensi](https://developer.mozilla.org/en/JavaScript/Reference/operators/operator_precedence) (kamu tak usah mengingat ini, tapi catat bahwa operator unary lebih tinggi dari binary terkait):
188+
=======
189+
Here's an extract from the [precedence table](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence) (you don't need to remember this, but note that unary operators are higher than corresponding binary ones):
190+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
187191

188192
| Presedensi | Nama | Tanda |
189193
|------------|------|------|

1-js/02-first-steps/09-comparison/1-comparison-questions/solution.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,20 @@ null === +"\n0\n" → false
1212

1313
Beberapa alasan:
1414

15+
<<<<<<< HEAD
1516
1. Sudah jelas, true.
1617
2. Pembandingan kamus, jadi false. `"a"` lebih kecil dari `"p"`.
1718
3. Lagi, pembandingan kamus, karakter pertama `"2"` lebih besar dari karakter pertama `"1"`.
1819
4. Nilai `null` dan `undefined` selalu bernilai sama.
1920
5. Equalitas ketat memang ketat. Tipe berbeda dari kedua sisi menghasilkan false.
2021
6. Serupa dengan `(4)`, `null` hanya sama dengan `undefined`.
2122
7. Equalitas ketat dari tipe berbeda.
23+
=======
24+
1. Obviously, true.
25+
2. Dictionary comparison, hence false. `"a"` is smaller than `"p"`.
26+
3. Again, dictionary comparison, first char `"2"` is greater than the first char `"1"`.
27+
4. Values `null` and `undefined` equal each other only.
28+
5. Strict equality is strict. Different types from both sides lead to false.
29+
6. Similar to `(4)`, `null` only equals `undefined`.
30+
7. Strict equality of different types.
31+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d

1-js/02-first-steps/11-logical-operators/6-check-if-in-range/task.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ nilai penting: 3
44

55
# Cek kisaran antara
66

7+
<<<<<<< HEAD
78
Tulis satu kondisi "if" untuk mengecek bahwa `age` ada di antara `14` dan `90` secara inklusif.
9+
=======
10+
Write an `if` condition to check that `age` is between `14` and `90` inclusively.
11+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
812
913
"Secara inklusif" artinya bahwa `age` bisa mencapai `14` atau `90`.

1-js/02-first-steps/11-logical-operators/7-check-if-out-range/task.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ nilai penting: 3
44

55
# Cek kisaran luar
66

7+
<<<<<<< HEAD
78
Tulis satu kondisi `if` untuk mengecek bahwa `age` BUKAN di antara 14 dan 90 secara inklusif.
9+
=======
10+
Write an `if` condition to check that `age` is NOT between `14` and `90` inclusively.
11+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
812
913
Buat dua varian: pertama menggunakan NOT `!`, kedua -- tanpaanya.

1-js/02-first-steps/11-logical-operators/9-check-login/solution.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33
```js run demo
44
let userName = prompt("Who's there?", '');
55

6-
if (userName == 'Admin') {
6+
if (userName === 'Admin') {
77

88
let pass = prompt('Password?', '');
99

10-
if (pass == 'TheMaster') {
10+
if (pass === 'TheMaster') {
1111
alert( 'Welcome!' );
12-
} else if (pass == '' || pass == null) {
12+
} else if (pass === '' || pass === null) {
1313
alert( 'Canceled' );
1414
} else {
1515
alert( 'Wrong password' );
1616
}
1717

18-
} else if (userName == '' || userName == null) {
18+
} else if (userName === '' || userName === null) {
1919
alert( 'Canceled' );
2020
} else {
2121
alert( "I don't know you" );

1-js/02-first-steps/11-logical-operators/article.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,11 @@ Operator OR `||` melakukan hal berikut:
8484

8585
Nilai dikembalikan di bentuk originalnya, tanpa konversi.
8686

87+
<<<<<<< HEAD
8788
Dengan kata lain, rantai OR `"||"` mengembalikan nilai truthy pertama atau yang terakhir jika tak ada nilai truthy.
89+
=======
90+
In other words, a chain of OR `||` returns the first truthy value or the last one if no truthy value is found.
91+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
8892
8993
Misalnya:
9094

@@ -101,9 +105,15 @@ Hal ini menjadikan penggunaan yang menarik dibanding "OR booleanpure, classical,
101105

102106
1. **Dapatkan nilai truthy dari daftar variabel atau expresi.**
103107

108+
<<<<<<< HEAD
104109
Untuk contoh, kita punya variabel `firstName`, `lastName` dan `nickName`, semuanya bersifat opsional.
105110

106111
Kita gunakan OR `||` untuk memilih satu-satunya yang memiliki data dan menampilkannya (atau `anonymous` jika belum ada yang ditentukan atau di set):
112+
=======
113+
For instance, we have `firstName`, `lastName` and `nickName` variables, all optional (i.e. can be undefined or have falsy values).
114+
115+
Let's use OR `||` to choose the one that has the data and show it (or `"Anonymous"` if nothing set):
116+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
107117
108118
```js run
109119
let firstName = "";
@@ -115,7 +125,11 @@ Hal ini menjadikan penggunaan yang menarik dibanding "OR booleanpure, classical,
115125
*/!*
116126
```
117127

128+
<<<<<<< HEAD
118129
Jika semua variabel bernilai falsy, `Anonymous` akan muncul.
130+
=======
131+
If all variables were falsy, `"Anonymous"` would show up.
132+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
119133
120134
2. **Evaluasi Short-circuit.**
121135

@@ -223,11 +237,15 @@ Presedensi operator AND `&&` lebih tinggi dari OR `||`.
223237
Jadi kode `a && b || c && d` esensinya sama dengan jika expresi `&&` dibungkus tanda kurung: `(a && b) || (c && d)`.
224238
````
225239

240+
<<<<<<< HEAD
226241
<<<<<<< HEAD
227242
````warn header="Jangan ganti `if` dengan || atau &&"
228243
Terkadang, orang-orang menggunakan operator AND `&&` untuk "memperpendek instruksi `if`".
229244
=======
230245
````warn header="Don't replace `if` with || or &&"
246+
=======
247+
````warn header="Don't replace `if` with `||` or `&&`"
248+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
231249
Sometimes, people use the AND `&&` operator as a "shorter way to write `if`".
232250
>>>>>>> f830bc5d9454d85829e011d914f215eb5896579a
233251

@@ -249,7 +267,11 @@ let x = 1;
249267
if (x > 0) alert( 'Greater than zero!' );
250268
```
251269

270+
<<<<<<< HEAD
252271
Walaupun, versi dengan `&&` muncul lebih pendek, `if` menjadi jelas dan sedikit lebih mudah dibaca. Jadi kita merekomendasikan menggunakannya untuk setiap kebutuhan: gunakan `if` jika kita ingin if dan gunakan `&&` jika kita ingin AND.
272+
=======
273+
Although, the variant with `&&` appears shorter, `if` is more obvious and tends to be a little bit more readable. So we recommend using every construct for its purpose: use `if` if we want `if` and use `&&` if we want AND.
274+
>>>>>>> f489145731a45df6e369a3c063e52250f3f0061d
253275
````
254276

255277

1-js/02-first-steps/12-nullish-coalescing-operator/article.md

Lines changed: 74 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,56 +2,93 @@
22

33
[recent browser="new"]
44

5-
Operator penggabungan *nullish* `??` menyediakan sintaks yang pendek untuk memilih nilai yang telah didefinisikan/*defined* dari daftar.
5+
Disini, didalam artikel ini, kita bisa mengatakan sebuah ekspresi telah "didefinisikan" ketika nilainya bukanlah `null` ataupun `undefined`.
66

7-
Hasil dari sebuah `a ?? b` adalah:
8-
- `a` jika nilainya tidak `null` atau `undefined`,
9-
- `b` jika sebaliknya.
7+
Operator penggabungan nullish ditulis sebagai dua tanda tanya `??`.
108

11-
Jadi, `x = a ?? b` adalah kependekan yang sama seperti:
9+
Hasil dari `a ?? b` adalah:
10+
- jika `a` telah didefinisikan, maka `a`,
11+
- jika `a` belum didefinisikan, maka `b`.
12+
13+
14+
Dengan kata lain, `??` mengembalikan argumen pertama jika argumen tersebut telah didefinisikan. Sebaliknya, mengembalikan argumen kedua jika argumen pertama belum didefinisikan.
15+
16+
Operator penggabung nullish bukanlah sesuatu yang benar-benar baru. Operator itu hanyalah sebuah sintaks yang bagus untuk mendapatkan nilai pertama yang telah "didefinisikan" dari dua nilai.
17+
18+
Kita bisa menulis ulang `result = a ?? b` menggunakan operator yang sudah kita ketahui, seperti ini:
1219

1320
```js
14-
x = (a !== null && a !== undefined) ? a : b;
21+
result = (a !== null && a !== undefined) ? a : b;
1522
```
1623

17-
Kita lihat contoh yang lebih panjang.
24+
Penggunaan umum untuk `??` adalah untuk menyediakan nilai _default_ untuk variabel yang mungkin _undefined_.
1825

19-
Bayangkan, kita mempunyai seorang pengguna, dan terdapat variabel `firstName`, `lastName` atau `nickName` untuk nama depan, nama belakang atau nama panggilan. Semuanya akan menjadi *undefined*, jika pengguna tidak memasukan nilai apapun.
26+
Sebagai contoh, kita disini menampilkan `Anonymous` jika `user` belum didefinisikan:
2027

21-
Kita ingin menampilkan nama penggunanya: Salah satu dari nilai variabel tersebut atau tampilkan Anonim jika tidak ada nama yang dimasukan.
28+
```js run
29+
let user;
2230

23-
Ayo kita gunakan operator `??` untuk memilih nilai pertama yang sudah terdefinisikan:
31+
alert(user ?? "Anonymous"); // Anonymous
32+
```
33+
34+
tentu saja, jika `user` memiliki nilai apapun kecuali `null/undefined`, maka kita akan bisa melihat nilainya:
35+
36+
```js run
37+
let user = "John";
38+
39+
alert(user ?? "Anonymous"); // John
40+
```
41+
42+
Kita juga bisa menggunakan rentetan `??` untuk mendapatkan nilai yang telah didefinisikan dari sebuah daftar.
43+
44+
Katakan kita memiliki sebuah data _user_ didalam sebuah variabel `firstName`, `lastName`, atau `nickName`. Semuanya mungkin saya memiliki nilai _undefined_, jika _user_ nya tidak memasukan nilainya.
45+
46+
Kita ingin menampilkan nama _user_ menggunakan salah satu dari variabel ini, atau menampilkan "Anonymous" jika semua nilainya adalah _undefined_.
47+
48+
Kita coba gunakan operator `??` untuk hal itu:
2449
2550
```js run
2651
let firstName = null;
2752
let lastName = null;
2853
let nickName = "Supercoder";
2954

30-
// tampilkan nilai pertama yang tidak bernilai null/undefined
55+
// tampilkan nilai pertama yang telah didefinisikan:
3156
*!*
3257
alert(firstName ?? lastName ?? nickName ?? "Anonymous"); // Supercoder
3358
*/!*
3459
```
3560
3661
## Perbandingan dengan ||
3762
38-
Operator OR `||` bisa digunakan dengan cara yang sama dengan operator `??`. Sebenarnya kita bisa menggantikan `??` dengan `||` di kode diatas dan mendapatkan hasil yang sama, seperti yang dijelaskan di [bab sebelumnya](info:logical-operators#or-finds-the-first-truthy-value).
39-
40-
Perbedaan yang paling penting adalah:
41-
- `||` mengembalikan nilai *truthy* pertama.
42-
- `??` mengembalikan nilai *defined*/terdefinisikan pertama.
63+
Operator OR `||` bisa digunakan dengan cara yag sama seperti `??`, seperti yang telah dijelaskan didalam [bab sebelumnya](info:logical-operators#or-finds-the-first-truthy-value).
4364
44-
Hal ini menjadi perhatian ketika kita ingin memperlakukan nilai `null/undefined` secara berbeda dengan `0`.
65+
Untuk contoh, pada kode diatas kita bisa mengganti `??` dengan `||` dan tetap mendapatkan hasil yang sama:
4566
46-
Contoh, coba perhatikan:
67+
```js run
68+
let firstName = null;
69+
let lastName = null;
70+
let nickName = "Supercoder";
4771

48-
```js
49-
height = height ?? 100;
72+
// tampilkan nilai pertama yang bernilai truthy:
73+
*!*
74+
alert(firstName || lastName || nickName || "Anonymous"); // Supercoder
75+
*/!*
5076
```
5177
52-
Potongan kode diatas akan memberikan nilai `100` jika `height` tidak terdefinisikan/*undefined*.
78+
Operator OR `||` sudah ada sejak awal mula dari Javascript, jadi sudah sejak lama pengembang menggunakan operator _or_ untuk kebutuhan seperti contoh diatas.
79+
80+
Disisi yang lain, operator penggabung nullish `??` baru saja ditambahkan, dan alasan penambahannya adalah karena para pengembang kurang senang dengan `||`.
81+
82+
Perbedaan halus, tapi penting adalah:
83+
- `||` mengembalikan nilai *truthy* pertama.
84+
- `??` mengembalikan nilai *terdefinisi* pertama.
85+
86+
Dengan kata lain, `||` tidak membedakan antara `false`, `0`, sebuah string kosong `""` dan `null/undefined`. Mereka dilihat sama oleh `||` -- nilai _falsy_. Jika salah satu nilai tersebut berada pada argumen pertama dari `||`, maka kita akan mendapatkan argumen kedua sebagai hasilnya.
87+
88+
Didalam penggunaannya, kita mungkin ingin menggunakan nilai _default_ hanya ketika variabelnya adalah `null/undefined`. Itulah, ketika nilainya benar-benar tidak diketahui/tidak diset.
5389
54-
Lalu kita coba bandingkan dengan `||`:
90+
91+
Contoh, perhatikan ini:
5592
5693
```js run
5794
let height = 0;
@@ -60,20 +97,20 @@ alert(height || 100); // 100
6097
alert(height ?? 100); // 0
6198
```
6299
63-
Disini, `height || 100` akan memperlakukan `0` sebagai belum didefinisikan/*undefined*, sama seperti `null`, `undefined` atau nilai *falsy* lainnya. Jadi nilainya adalah `100`.
100+
Disini, kita memiliki _height_ nol.
64101
65-
Sedangkan `height ?? 100` akan mengembalikan `100` hanya jika `height` nilainya `null` atau `undefined`. Jadi `alert`nya akan menampilkan nilai `height` sama dengan `0`.
102+
- Bagian `height || 100` memeriksa `height` sebagai nilai yang _falsy_, dan ternyata benar.
103+
- jadi hasilnya adalah argumen kedua, `100`.
104+
- Bagian `height ?? 100` memeriksa `height` sebagai `null/undefined`, dan ternyata tidak.
105+
- jadi hasil dari `height` adalah "sebagaimana adanya", yang mana adalah `0`.
66106
67-
Jadi mana yang lebih baik, tergantung pada kasus-kasus tertentu atau kasus yang dihadapi.
68-
Ketika nilai `0` adalah nilai yang valid, maka `??` menjadi rekomendasi.
107+
Jika kita asumsikan bahwa _height_ nol adalah nilai yang valid, maka nilainya tidak seharusnya diganti dengan nilai _default_, maka `??` melakukan hal yang benar.
69108
70109
## Precedence/Hak lebih tinggi
71110
72-
Operator `??` memiliki nilai *precedence*: `5` didalam [Tabel MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table).
73-
74-
Jadi `??` akan dievaluasi setelah kebanyakan operasi lainnya, tapi sebelum `=` dan `?`.
111+
_Precedence_ dari operator `??` agak rendah: `5` didalam [tabel MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table). Jadi `??` akan dievaluasi sebelum `=` dan `?`, tapi setelah di kebanyakan dari operasi lainnya, seperti `+`, `*`.
75112
76-
Jika kita ingin memilih sebuah nilai dengan `??` didalam ekspresi yang kompleks, cobalah untuk menggunakan kurung:
113+
Jadi jika kita ingin memilih sebuah nilai dengan `??` didalam sebuah ekspresi dengan operator lain, cobalah untuk menggunakan kurung:
77114
78115
```js run
79116
let height = null;
@@ -85,18 +122,19 @@ let area = (height ?? 100) * (width ?? 50);
85122
alert(area); // 5000
86123
```
87124
88-
Sebaliknya, jika kita menghilangkan kurung, `*` akan memiliki nilai *precedence* lebih tinggi dari `??` dan akan dijalankan lebih dulu.
89-
90-
Dan akan dijalankan sama seperti:
125+
Sebaliknya, jika kita menghilangkan kurungnya, maka operator `*` akan memiliki nilai _precedence_ yang lebih tinggi dari `??`, yang mana akan dieksekusi pertama, yang akan menghasilkan nilai yang salah.
91126
92127
```js
93-
// mungkin kurang tepat
128+
// tanpa kurung
129+
let area = height ?? 100 * width ?? 50;
130+
131+
// ...akan dieksekusi sama seperti ini (mungkin bukan ini yang kita inginkan):
94132
let area = height ?? (100 * width) ?? 50;
95133
```
96134
97-
Dan juga terdapat sebuah batasan untuk level-bahasa.
135+
### Menggunakan ?? dengan && atau ||
98136
99-
**Karena masalah keamanan, sangat tidak direkomendasikan untuk menggunakan `??` bersamaan dengan operator `&&` dan `||`.**
137+
Karena masalah keamanan, javascript melarang menggunakan operator `??` bersama dengan `&&` dan `||`, kecuali jika kita secara jelas menggunakan kurung.
100138
101139
Kode dibawah akan menampilkan sintaks error:
102140

0 commit comments

Comments
 (0)