Perbedaan Operator perbandingan == dan === dalam javaScript

JavaScript memiliki 2 operator untuk membandingkan dua buah nilai, yaitu:

  1. Strict Equality Operator ===. Operator yang ketat, lurus, tanpa basa-basi.
  2. Lenient (Normal) Equality Operator ==. Lebih sabar, bisa memaafkan kesalahan programer saat membandingkan 2 tipe data yang berbeda.

Perbedaannya adalah yang pertama hanya mempertimbangkan jika 2 buah nilai yang dibandingkan meiliki tipe data yang sama, selain itu maka bernilai false. Sedangkan yang kedua akan memaksakan konversi nilai yang berbeda sebelum membandingkannya seperti pada tipe pertama.

Semua programer JavaScript sepakat untuk hanya menggunakan tipe pertama. Alasannya karena konversi otomatis mungkin menimbulkan hasil yang tidak dikehendaki. Karena sifat pemaafnya ini, kesalahan yang dibuat sang programer akan tersembunyi sampai akhirnya timbul masalah.

Strict Equal ===
Membandingkan 2 buah nilai yang berbeda tipe datanya dengan operator ===, sudah pasti bernilai false. Jika kedua buah nilai memiliki tipe data yang sama, pernyataan-pernyataan di bawah ini akan bernilai true.

  • undefined === undefined
  • null === null
  • x === x
  • +0 === -0
  • false === false
  • NAN !== NAN

Nilai nol (0) baik positif atau negatif adalah sama nilainya. Untuk NAN, tidak bisa dibandingkan dengan nilai apapun termasuk dengan nilai NAN sendiri. Tipe data string dan number dibandingkan seperti biasa.

Equal ==
Membandingkan 2 buah nilai, jika keduanya memiliki tipe data sama, bandingkan dengan ‘===’. Selain itu:

  1. undefined == null
  2. number dibandingkan dengan string, konversi string ke number
  3. boolean dibandingkan non-boolean, konversi boolean ke number, kemudian bandingkan (angka 0 bernilai false, 1 true)
  4. membandingkan string atau number dengan object, konversi object ke tipe data primitif, kemudian bandingkan

Contoh-contoh yang sering dijumpai:

0 == false //true
1 == true //true
2 == true //false
2 ? true : false //true, karena 2 !== 0

"" == 0 //true
"" == false //true

1 == "1" //true
"1" == true //true

"2" == true //false
"true" == true //false
"2" ? true : false //true, karena string tidak kosong
"abc" == new String("abc") //true, tipe object dikonversi ke tipe primitif string

Satu yang agak membingunkan di atas adalah pada pernyataan if atau pada operator ternary, angka lebih besar dari 1 bernilai true, namun bernilai false dalam perbandingan.

Berikut ini adalah beberapa contoh perbandingan dengan ‘==’ yang terkenal membingungkan dan dapat menimbulkan kesalahan.

'' == '0' // false
0 == '' // true
0 == '0' // true

false == 'false' // false
false == '0' // true

null == undefined // true
false == undefined // false
false == null // false

' \t\r\n ' == 0 // true

Sumber: http://www.2ality.com/2011/06/javascript-equality.html

02. March 2013 by Sibudi
Categories: JavaScript | Tags: , , | Leave a comment

Perjanjian yang Menguntungkan

Saya tidak tahu kapan dan di mana cerita ini terjadi. Mungkin juga tidak pernah terjadi.

Suatu hari, seorang konglomerat bertemu dengan rekan bisnisnya. Rekan tersebut, yang juga sangat kaya raya, menawarinya suatu perjanjian yang menurutnya, orang paling bodoh sekalipun tidak akan melewatkan kesempatan tersebut. Menurut penghitungannya, transaksi tersebut mampu melipatgandakan kekayaannya hanya dalam waktu beberapa hari. Isi perjanjiannya sebagai berikut.

Setiap hari selama satu bulan, si rekan akan meminjamkan uang sebesar 100.000 (seratus ribu) rupiah kepada si konglomerat. Tentu saja pinjaman itu tidak cuma-cuma. Si konglomerat diwajibkan untuk mengembalikannya, tapi dengan jumlah yang jauh lebih sedikit. Pada hari pertama, si konglomerat harus membayar 1 (satu) sen. Kemudian untuk 100.000 rupiah yang kedua, si konglomerat harus membayar 2 (dua) sen. Seratus ribu rupiah yang ketiga, 4 (empat) sen. Untuk yang keempat, 8 (delapan) sen. Untuk yang kelima, 16 (enam belas) sen. Jadi setiap hari, si konglomerat harus membayar dua kali lipat dari yang dibayarkan pada hari sebelumnya.

Pada mulanya si konglomerat tampak kebingungan dan penasaran dengan bisnis tersebut. Sampai rekan bisnisnya meyakinkannya bahwa dia tidak akan meminta lebih dari yang sudah dijelaskan tadi. Si rekan hanya meminta si konglomerat untuk menepati janjinya. Setiap hari si rekan akan memberikan 100.000 rupiah dan setiap hari si konglomerat harus membayar sesuai jumlah yang sudah disepakati bersama. Ketentuan lain adalah tidak boleh berhenti sebelum satu bulan penuh.

Si rekan mungkin sudah gila atau ingin bersenang-senang sebelum mati. Dia membuang jutaan rupiah dalam waktu satu bulan hanya untuk ditukar beberapa sen. Ini adalah kesempatan emas yang tidak mungkin dilewatkan.

Hanya ada satu ketakutan dalam diri si konglomerat. Dia takut kalau si rekan menyadari kebodohannya dan membatalkan perjanjian tersebut.

Namun keesokan harinya, si rekan benar-benar datang menepati janjinya dengan membawa uang 100.000 rupiah. Tak lupa dia langsung menagih hak 1 sen yang sudah mereka sepakati. Si konglomerat masih kurang percaya dengan si rekan. Berulang kali dia menghitung dan memeriksa uang tersebut. Uang tersebut asli dan jumlahnya pas, jadi si rekan memang tidak menipunya. Si konglomerat girang bukan kepalang. Rezeki nomplok!

Sebelum pulang, si rekan mengatakan bahwa besok dia akan datang kembali membawa uang 100.000 rupiah sambil mengingatkan si konglomerat untuk menyiapkan uang 2 sen. Hari yang ketiga 4 sen, hari keempat 8 sen, hari kelima 16 sen, dan 32 sen untuk hari keenam. Pada hari ketujuh, si konglomerat menerima 700.000 rupiah dan hanya membayar:

1 + 2 + 4 + 8 + 16 + 32 + 64 = 127 sen = 1 rupiah 27 sen.

Konglomerat tamak ini merasa menyesal, mengapa perjanjiannya hanya untuk 1 bulan. Ini berarti dia hanya akan menerima 3.000.000 rupiah. Dia mulai berpikir untuk membujuk si rekan untuk memperpanjang perjanjian mereka. Tapi itu diurungkannya karena beresiko si rekan akan menyadari ketololannya.

Hari kedelapan, si konglomerat membayar 128 sen (1 rupiah 28 sen). Hari kesembilan 256 sen (2 rupiah 56 sen). Hari kesepuluh 512 sen (5 rupiah 12 sen). Hari kesebelas 1024 sen (10 rupiah 24 sen). Hari kedua belas 2048 sen (20 rupiah 48 sen). Hari ketiga belas 4096 sen (40 rupiah 96 sen). Hari keempat belas 8192 sen (81 rupiah 92 sen).

Namun nasib baik si konglomerat tak berumur panjang. Dia segera menyadari bahwa perjanjian itu akan menimbulkan bencana. Setelah 14 hari membayar dengan uang receh, kini dia harus membayar dengan uang ratusan rupiah. Parahnya lagi, pembayarannya meningkat tajam:

Hari ke-15 => 163 rupiah 84 sen
Hari ke-16 => 327 rupiah 68 sen
Hari ke-17 => 655 rupiah 36 sen
Hari ke-18 => 1.310 rupiah 72 sen
Hari ke-19 => 2.621 rupiah 44 sen

Dia masih belum rugi banyak, akan tetapi keuntungannya terus berkurang drastis. Setelah itu si konglomerat harus membayar:

Hari ke-20 => 5.242 rupiah 88 sen
Hari ke-21 => 10.485 rupiah 76 sen
Hari ke-22 => 20.971 rupiah 52 sen
Hari ke-23 => 41.943 rupiah 4 sen
Hari ke-24 => 83.886 rupiah 8 sen
Hari ke-25 => 167.772 rupiah 16 sen

Pada hari kedua puluh lima, si konglomerat malah membayar lebih banyak dari pada yang diterimanya untuk satu hari. menurut perjanjian, dia tidak dapat berhenti sebelum tepat 1 bulan. Setelah itu segalanya bertambah buruk, nasi telah menjadi bubur. Si konglomerat baru menyadari bahwa dia tertipu.

Hari ke-26 => 335.544 rupiah 32 sen
Hari ke-27 => 671.088 rupiah 64 sen
Hari ke-28 => 1.342.177 rupiah 28 sen
Hari ke-29 => 2.684.354 rupiah 56 sen
Hari ke-30 => 5.368.709 rupiah 12 sen

Ketika si rekan datang untuk terakhir kalinya, si konglomerat dengan lunglai menghitung berapa banyak yang dia bayarkan untuk 3.000.000 rupiah. Ternyata jumlahnya adalah 10.737.418 rupiah 23 sen.

Umpan 3 juta rupiah itu harus dibayar mahal dengan tekor lebih dari 7 juta rupiah!

Sebelum mengakhiri cerita ini, saya akan memperlihatkan kalkulasi kerugian si konglomerat.

1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 + 256 + 512 + 1024 + dst...

Tentunya angka-angka tersebut tidak asing bagi seorang yang bergelut di bidang teknologi informasi. Untuk memperoleh jumlah uang pada hari ke-n, rumusnya adalah 2n / 100. Dimulai dari n = 0 untuk hari pertama dan karena satuan uang terkecil adalah sen maka hasilnya harus dibagi 100. Sehingga untuk mendapatkan jumlah uang yang harus dibayarkan si konglomerat pada hari terakhir adalah 229 / 100 = 536.870.912 / 100 = 5.368.709,12.

Untuk menghitung jumlah keseluruhan yang harus dibayarkan juga tidak sulit:

 1 = (0) + 1 
 2 = (1) + 1
 4 = (1 + 2) + 1 
 8 = (1 + 2 + 4) + 1
16 = (1 + 2 + 4 + 8) + 1
...

Dapat dilihat bahwa setiap angka adalah sama dengan jumlah angka sebelumnya ditambah 1. Jadi misal kita ingin menambahkan semua angka dari hari pertama (1) sampai hari kelima (16), maka kita cukup menambahkan angka terakhirnya (16) dengan jumlah semua angka sebelumnya, atau dengan kata lain, angka yang sama dikurangi 1. Hasilnya adalah 16 + (16 – 1) = 31.

Dengan cara tersebut dapat dengan mudah dihitung jumlah uang yang dibayarkan si konglomerat hanya dengan mengetahui jumlah pembayarannya yang terakhir. Jadi dengan menambahkan 5.368.709,12 dengan 5.368.709,11 maka akan diperoleh jumlah 10.737.418,23.

06. January 2013 by Sibudi
Categories: Off Topic | Tags: | 1 comment

10 Pengetahuan/Perintah Dasar Linux

Sejak lama saya ingin menambahkan satu kategori catatan lagi yang sangat dekat dengan kehidupan sebagai programer komputer, yaitu baris perintah (command-line). Dalam dunia Linux dikenal 2 antarmuka pengguna, GUI (Graphical User Interfaces) dan CLI (Command Line Interface). GUI memungkinkan pengguna untuk menunjuk, mengeklik, menarik, dan meletakan objek dengan menggunakan perangkat mouse. Pengguna dapat dengan mudah menyelesaikan pekerjaan tanpa/sedikit membaca dokumentasinya. Sedangkan, CLI mengharuskan pengguna untuk mengetikan sesuatu untuk memerintah komputer melakukan apa yang diinginkan. Menggunakan CLI jelas lebih cepat dan berdayaguna, tapi untuk itu memerlukan pengetahuan tentang perintah-perintah apa saja yang dipahami oleh komputer.

Linux adalah sistem operasi turunan dari Unix, semua perintah yang bekerja pada Unix juga dapat berkerja pada Linux. Ada banyak jenis/distribusi Linux, tetapi semuanya menggunakan perintah yang sama dan bisa diketikan melalui terminal CLI. Berbeda dengan GUI yang tidak memiliki standar, sehingga masing-masing distribusi memiliki antarmuka sendiri-sendiri. (1)

Akan tetapi, pengguna yang berpengalaman sekalipun masih sering melakukan salin dan tempel perintah. Ada banyak sekali perintah dasar dan kombinasinya yang tidak mungkin untuk dihafalkan semuanya. Berikut ini adalah 10 pengetahuan/perintah dasar yang sering digunakan pada Linux. Keyboard shorcut untuk membuka terminal adalah Ctrl + Alt + T.

  1. Simbol tilde (~): sebagai pengganti direktori “home”. Jika pengguna memiliki nama “user”, simbol ‘~’ berarti /home/user
    sibudi@sibudi-pc:~$ 
    
  2. pwd (print working directory): perintah ini berguna untuk menampilkan direktori aktual.
    sibudi@sibudi-pc:~/Desktop$ pwd
    /home/sibudi/Desktop
    
  3. ls (list): menampilkan daftar berkas yang ada pada direktori aktual. Dikombinasikan dengan pilihan-pilihan yang ada, misalnya ls -lh, akan menampilkan daftar berkas dalam format memanjang kesamping lengkap dengan informasi hak akses dan ukurannya dengan format yang mudah dibaca manusia (contoh: 1K, 23M, 4G).
    sibudi@sibudi-pc:~/Desktop$ ls -lh
    total 4.0K
    -rw-rw-r-- 1 sibudi sibudi 1.5K Dec 14 15:16 jadwal
    
  4. cd (change directories): seperti namanya, perintah ini untuk berpindah direktori. Contoh:
    1. cd atau cd ~: pindah ke direktori “home”.
    2. cd /: pindah ke direktori “root”.
    3. cd ..: naik 1 tingkat ke direktori di atasnya.
    4. cd -: kembali ke direktori sebelumnya (otomatis tersimpan pada variabel $OLDPWD)
    5. Untuk pindah melewati banyak direktori sekaligus, tuliskan secara penuh alamat direktori yang dituju. Misal untuk pindah ke direktori “www” yang ada di bawah direktori “var”:
      sibudi@sibudi-pc:~$ cd /var/www
      
  5. cp (copy): menyalin sebuah berkas. Jika ingin menyalin sebuah direktori beserta isinya, gunakan cp -r (copy recursively)
    sibudi@sibudi-pc:~$ cp berkas.txt Documents/berkas.txt
    sibudi@sibudi-pc:~$ cp -r direktoriBerkas Documents/
    
  6. mv (move): perintah untuk memindahkan berkas ke lokasi yang berbeda atau untuk mengubah namanya (tanpa memindahkannya). Contoh berikut ini adalah untuk mengubah nama “berkas_lama” menjadi “berkas” kemudian memindahkan “berkas” ke “Desktop”
    sibudi@sibudi-pc:~$ mv berkasLama berkas
    sibudi@sibudi-pc:~$ mv berkas ~/Desktop
    
  7. rm (remove): perintah untuk menghapus berkas pada sebuah direktori. Untuk menghapus direktori, gunakan rmdir, tapi hanya bisa menghapus direktori yang kosong. Untuk menghapus direktori beserta isinya, gunakan rm -r.
    sibudi@sibudi-pc:~$ rm berkas
    sibudi@sibudi-pc:~$ rm -r direktoriBerkas
    
  8. mkdir (make directory): perintah untuk menciptakan sebuah direktori.
    sibudi@sibudi-pc:~$ mkdir direktori
    
  9. sudo (super user do): perintah yang digunakan untuk melakukan operasi yang berhubungan dengan pengguna level root. Misalnya untuk memindahkan berkas dari direktori “/” ke direktori “~/Documents”. Pengguna akan diminta untuk mengisikan kata kunci untuk root Berhati-hatilah dalam menggunakan perintah ini karena mungkin saja kita menghapus berkas-berkas yang penting untuk sistem operasi.
    sibudi@sibudi-pc:~$ sudo mv /berkas ~/Documents
    
  10. man (manual): untuk menampilkan dokumentasi dari perintah-perintah yang ada.
    sibudi@sibudi-pc:~$ man man
    sibudi@sibudi-pc:~$ man rm
    

(1) diambil dari man intro

15. December 2012 by Sibudi
Categories: Linux | Tags: , , | 2 comments

Perbedaan Left Join dan Left Outer Join

Mungkin ada yang belum tahu, bahwa kata kunci OUTER sebenarnya adalah bersifat opsional. Jadi, baik ditulis atau tidak, hasilnya tetap sama. Pada dasarnya, semua bagian dari kata kunci JOIN adalah opsional. Jika hanya ditulis JOIN saja tanpa embel-embel LEFT/RIGHT, FULL, atau CROSS, default-nya adalah INNER. Contoh di bawah ini adalah sebuah query dengan kata kunci JOIN yang artinya sama dengan INNER JOIN.

SELECT * FROM A JOIN B
ON A.X = B.Y

Berikut ini adalah daftar query beserta persamaannya.

A LEFT JOIN B = A LEFT OUTER JOIN B
A RIGHT JOIN B = A RIGHT OUTER JOIN B
A FULL JOIN B = A FULL OUTER JOIN B
A INNER JOIN B = A JOIN B
A, B = A CROSS JOIN B

Pada baris terakhir adalah syntax lama yang sudah mulai ditinggalkan tapi masih didukung oleh banyak mesin database modern. Penggabungan dua buah table atau lebih menggunakan tanda koma (,) sebaiknya dihindari, karena dapat menimbulkan ketaksaan (ambiguitas) ketika misalnya kata kunci INNER dan OUTER digunakan secara bersamaan pada suatu query. Ketaksaan tersebut mungkin saja diinterpretasikan berbeda dari satu mesin database ke yang lainnya.

Kerugian lain dari syntax lama adalah hasilnya akan selalu bernilai CROSS JOIN jika kita lupa untuk menambahkan klausa WHERE. Pada syntax baru yang menggunakan kata kunci JOIN, hal ini tidak mungkin terjadi karena akan menimbulkan kegagalan pada saat pemeriksaan syntax sebelum dijalankan oleh mesin database.

Kesimpulan dari catatan ini adalah:
1. Jika hanya ditulis JOIN, artinya adalah INNER JOIN.
2. Kata kunci OUTER, harus didahului oleh LEFT/RIGHT/FULL. Tidak bisa hanya ditulis OUTER JOIN.
3. Kata kunci OUTER bersifat opsional, jadi bisa ditulis LEFT JOIN atau RIGHT JOIN atau FULL JOIN saja.
4. CROSS JOIN berarti kita membuat daftar dari table pertama dikali dengan daftar dari table kedua. Akan menghasilkan semua kemungkinan dari kedua table tersebut (Cartesian product).

Jika ingin lebih jelas mengenai masing-masing kata kunci JOIN, bisa membaca pada catatan lalu, yang menganalogikan kata kunci JOIN dengan Diagram Venn.

24. November 2012 by Sibudi
Categories: SQL | Tags: , , | Leave a comment

Memeriksa Bilangan Palindrom

Palindrom adalah kata, rangkaian kata, atau bilangan yang terbaca sama, baik dari depan maupun dari belakang. Beberapa contoh palindrom adalah radar, kasur rusak, 1001.

Pada bahasa pemrograman Java kita dapat dengan mudah memastikan bahwa suatu string adalah palindrom atau bukan.

boolean isPalindrom (String str) {
  
  return str.equals(new StringBuffer().append(str).reverse().toString());
}

Kode di atas mengembalikan nilai true jika argumennya adalah palindrom. Namun untuk memeriksa palindrom dari argumen berupa bilangan, kita membutuhkan type casting. Type casting berguna untuk mengkonversi suatu tipe data ke tipe data yang lain. Dalam kasus ini kita membutuhkan konversi dari tipe data int ke String. Caranya mudah saja, tinggal tambahkan saja bilangan tersebut dengan sebuah string kosong.

boolean isPalindrom (int bilangan) {
  
  String str = "" + bilangan;
  return str.equals(new StringBuffer().append(str).reverse().toString());
}

Dengan kode di atas kita bisa memeriksa apakah sebuah bilangan termasuk palindrom atau bukan.

Untuk Anda yang malas menghafal kode yang panjang di atas, kita bisa menggunakan pemeriksaan palindrom secara manual. Pada dasarnya algoritma palindrom yaitu membandingkan karakter pertama dengan karakter terakhir, lalu karakter kedua dengan karakter kedua dari belakang, dan seterusnya. Jika jumlah karakternya ganjil, misalnya “radar” (5 karakter), karakter yang berada tepat di tengah-tengah, yaitu karakter ketiga (“d”) tidak perlu diperiksa.

boolean isPalindrom (int bilangan) {

  String str = "" + bilangan;    // konversi dari int ke Str
  char [] c = str.toCharArray(); // konversi dari String ke array char
  int i1 = 0,        // indeks pertama
  i2 = c.length - 1; // indeks terakhir

  while (i2 > i1) {

    if (c[i1 ++] != c[i2 --])
      return false;
  }

  return true;
}

Pada baris keempat kita konversikan tipe data String ke bentuk dasarnya yaitu sekumpulan karakter dengan method toCharArray(). Pada baris kesepuluh, kita akan membandingkan sekaligus menambah indeks i1 dan mengurangi indeks i2. Perhatikan bahwa operator unary ditulis setelah variable berarti bahwa pembadingan dilakukan terlebih dahulu kemudian baru menambah/mengurangi indeksnya.

02. October 2012 by Sibudi
Categories: Java | Tags: , , , | 1 comment

← Older posts