Tag: Pemrograman

  • 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

  • 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.

  • 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.

  • Operator Ternary dan Nilai Boolean

    Di blog ini pernah dibahas mengenai operator ternary untuk menyingkat kode. Contohnya ada sepotong kode seperti berikut:

    if ($nilai > 90)
      echo "Keren";
    
    else
      echo "Lumayan";
    

    Kode di atas dapat ditulis ulang menggunakan operator ternary menjadi seperti berikut:

    echo ($var > 90) ? "Keren" : "Lumayan";
    

    Seorang programer berpengalaman pasti lebih suka menggunakan operator ternary bahkan untuk yang melibatkan lebih dari dua buah pernyataan. Namun tidak direkomendasikan untuk para pemula karena bisa membingungkan.

    Saya sendiri pernah melakukan hal konyol pada tulisan yang lalu, yaitu penggunaan operator ternary dengan nilai boolean yang tidak semestinya.

    $cek = ($var > 5) ? true : false;
    

    Padahal seharusnya cukup ditulis seperti ini:

    $cek = $var > 5;
    

    Variable $cek otomatis bernilai true jika kondisi $var > 5 terpenuhi. Sebaliknya bernilai false jika kondisi tidak terpenuhi. Contoh kasus lain penggunaan operator ternary yang tidak semestinya adalah:

    $cek = ($var == true) ? 1 : 0;
    

    Secara tidak sadar mungkin kita sering melakukan hal semacam ini dalam pengkodean sehari-hari. Pada contoh di atas juga terdapat kondisi yang tidak perlu dan seharusnya dihilangkan sehingga menjadi seperti berikut:

    $cek = $var ? 1 : 0;
    

    Catatan ini juga sebagai koreksi untuk tulisan yang lalu.

  • Menukar Nilai Dua Variable Tanpa Perantara

    Menukar nilai dua buah variable adalah salah satu algoritma dasar dalam struktur data. Biasanya untuk menulis fungsi swap ini, kita membutuhkan tambahan satu variable sebagai perantara. Berikut ini adalah algoritma untuk menukar nilai dua buah variable dengan perantara.

    tmp = x;
    x = y;
    y = tmp;
    

    Pada contoh di atas nilai variable x dan y bertukar melalui perantara tmp. Berikut ini adalah algoritma untuk menukar nilai dua buah variable tanpa perantara.

    x = x ^ y;
    y = x ^ y;
    x = x ^ y;
    

    Singkat dan sederhana, nilai variable x dan y sudah bertukar. Tanda caret ^ dalam bahasa pemrograman Java dan C adalah operator bitwise (logika) XOR (Eksklusif Or). Pada eksklusif or berlaku hukum alternatif, yaitu hanya salah satu saja yang boleh bernilai true. Perbedaannya dengan inklusif or (OR) adalah berlaku hukum kumulatif, yaitu boleh salah satu atau keduanya bernilai true.

    x  y   OR  XOR
    --------------
    0  0    0   0
    0  1    1   1
    1  0    1   1
    1  1    1   0
    

    Penjelasan dari keajaiban pertukaran di atas adalah karena operator XOR memiliki dua sifat. Pertama, menggabungkan/mencampurkan informasi, dan kedua, mampu memisahkannya kembali (sekaligus menghapus jejak penggabungannya) dengan cara melakukan lagi operasi XOR kepadanya.

    Pada baris pertama, nilai x dan y digabungkan sehingga membentuk suatu nilai hybrid di antara keduanya (sifat 1). Simpan nilai hybrid tersebut di x. Pada baris kedua nilai hybrid di-XOR-kan lagi dengan y yang akan memunculkan lagi nilai x semula (sifat 2). Simpan nilai x semula di y. Terakhir nilai hybrid di-XOR-kan dengan y (ingat y sekarang bernilai x semula) sehingga memunculkan lagi nilai y semula (sifat 2). Simpan nilai y semula di x.

    Supaya lebih jelas lagi, kita coba dengan contoh. Misalnya int x bernilai 5 (0101) dan int y bernilai 9 (1001).

    x = 5 = 0101;
    y = 9 = 1001;
    
    x = x ^ y; // x = 0101 ^ 1001 = 1100 = hybrid
    y = x ^ y; // y = 1100 ^ 1001 = 0101 = 5
    x = x ^ y; // x = 1100 ^ 0101 = 1001 = 9
    

    Implementasi pertukaran nilai dengan operator logika XOR dalam bahasa pemrograman Java adalah sebagai berikut.

    int x = 5, y = 9;
    
    x ^= y; // x = hybrid
    y ^= x; // y = 5
    x ^= y; // x = 9
    

    Begitulah cerita dibalik dua nilai variable yang tertukar :D. Pembahasan lebih mendalam tentang XOR Swap Algorithm bisa dibaca di Wikipedia.