Saya menggunakan jQuery 1.7.1
Saya baru mulai menggunakan operator terner JavaScript untuk mengganti pernyataan if / else sederhana. Saya telah melakukannya dengan sukses di beberapa tempat. Saya terkejut ketika saya berhasil membuat sesuatu yang lain bekerja ketika saya pikir pasti itu tidak akan berhasil, tetapi saya tetap mencobanya.
Inilah pernyataan aslinya:
function updateItem() {
$this = $(this);
var IsChecked = $this.hasClass("IsChecked");
if (IsChecked == true){
removeItem($this);
} else {
addItem($this);
}
}
Berikut fungsi yang sama menggunakan operator terner:
function updateItem() {
$this = $(this);
var IsChecked = $this.hasClass("IsChecked");
(IsChecked == true) ? removeItem($this) : addItem($this);
}
Saya terkejut karena semua contoh yang saya lihat digunakan hanyalah mengatur variabel seperti ini:
x = (1 < 2) ? true : false;
Pertanyaan saya adalah apakah ini penggunaan "normal" dan akankah berfungsi di sebagian besar versi JavaScript? Dimana itu akan gagal? Apakah ada kegunaan lain yang kurang jelas untuk itu?
UPDATE - Terima kasih atas saran "dunia nyata" !!!
Saya menggunakan ini sebagai fungsi saya:
function updateItem() {
$this = $(this);
$this.hasClass("IsChecked") ? removeItem($this) : addItem($this);
}
sumber
(IsChecked ? removeItem : addItem)($this)
. Namun, untuk menjawab pertanyaan Anda, ya ini normal dan tidak ada yang salah dengan menggunakan operator terner selama mereka tidak mengurangi kemudahan pemeliharaan atau keterbacaan dalam situasi di mana diperlukan. jsfiddle.net/vsB3fif($this.hasClass("IsChecked")) removeItem($this); else addItem($this)
adalah cara yang tepat. Operator terner tidak dimaksudkan untuk kasus seperti ini tetapi untuk hal-hal sepertifoo(isChecked ? 'bar' : meow());
(yaitu ketika Anda peduli tentang "nilai balik" dari apa pun yang Anda lakukan di blok then / else)$(this).hasClass("IsChecked") ? removeItem($this) : addItem($this);
Saya dapat memahami kode Anda apa adanya pada satu baris, sehingga sesuai dengan aturan praktis saya (lihat posting di bawah). Bekerja untuk saya.Jawaban:
Heh, ada beberapa penggunaan sintaks terner yang cukup menarik dalam pertanyaan Anda; Saya suka yang terakhir yang terbaik ...
x = (1 < 2) ? true : false;
Penggunaan terner di sini sama sekali tidak perlu - Anda cukup menulis
x = (1 < 2);
Demikian pula, elemen kondisi dari pernyataan terner selalu dievaluasi sebagai nilai Boolean, dan oleh karena itu Anda dapat mengekspresikan:
(IsChecked == true) ? removeItem($this) : addItem($this);
Semudah:
Sebenarnya, saya juga akan menghapus
IsChecked
sementara juga yang membuat Anda memiliki:($this.hasClass("IsChecked")) ? removeItem($this) : addItem($this);
Adapun apakah ini sintaks yang dapat diterima, itu pasti! Ini cara yang bagus untuk mengurangi empat baris kode menjadi satu tanpa memengaruhi keterbacaan. Satu-satunya nasihat yang akan saya berikan kepada Anda adalah untuk menghindari beberapa pernyataan terner bersarang pada baris yang sama (begitulah letak kegilaan!)
sumber
($this.hasClass("isChecked") ? removeItem : addItem)($this)
Gaya terner umumnya digunakan untuk menghemat ruang. Secara semantik, keduanya identik. Saya lebih suka menggunakan sintaks if / then / else penuh karena saya tidak suka mengorbankan keterbacaan - saya sekolah tua dan saya lebih suka kawat gigi.
Format lengkap if / then / else digunakan untuk hampir semua hal. Ini sangat populer jika Anda masuk ke blok kode yang lebih besar di setiap cabang, Anda memiliki pohon if / else bercabang muti, atau beberapa else / ifs dalam string panjang.
Operator terner biasa digunakan saat Anda menetapkan nilai ke variabel berdasarkan kondisi sederhana atau Anda membuat beberapa keputusan dengan hasil yang sangat singkat. Contoh yang Anda kutip sebenarnya tidak masuk akal, karena ekspresi akan mengevaluasi salah satu dari dua nilai tanpa logika tambahan.
Ide bagus:
this > that ? alert(this) : alert(that); //nice and short, little loss of meaning if(expression) //longer blocks but organized and can be grasped by humans { //35 lines of code here } else if (something_else) { //40 more lines here } else if (another_one) /etc, etc { ...
Kurang bagus:
this > that ? testFucntion() ? thirdFunction() ? imlost() : whathappuh() : lostinsyntax() : thisisprobablybrokennow() ? //I'm lost in my own (awful) example by now. //Not complete... or for average humans to read. if(this != that) //Ternary would be done by now { x = this; } else } x = this + 2; }
Sebuah benar-benar dasar aturan praktis - dapat Anda memahami seluruh hal sebagai baik atau lebih baik pada satu baris? Ternary baik-baik saja. Jika tidak, perluas.
sumber
Saya juga ingin menambahkan sesuatu dari saya.
Sintaks lain yang memungkinkan untuk memanggil fungsi dengan operator terner, adalah:
Ini bisa berguna jika Anda harus meneruskan daftar parameter yang sama ke kedua fungsi, jadi Anda harus menuliskannya hanya sekali.
Anda dapat menggunakan operator terner bahkan dengan nama fungsi anggota, yang secara pribadi sangat saya sukai untuk menghemat ruang:
$('.some-element')[showThisElement ? 'addClass' : 'removeClass']('visible');
atau
$('.some-element')[(showThisElement ? 'add' : 'remove') + 'Class']('visible');
Contoh lain:
var addToEnd = true; //or false var list = [1,2,3,4]; list[addToEnd ? 'push' : 'unshift'](5);
sumber
Tidak ada yang terlalu rumit tentang contoh yang Anda posting.
Dalam operator terner, argumen pertama (bersyarat) dievaluasi dan jika hasilnya adalah
true
, argumen kedua dievaluasi dan dikembalikan, jika tidak, argumen ketiga dievaluasi dan dikembalikan. Masing-masing argumen tersebut dapat berupa blok kode yang valid, termasuk pemanggilan fungsi.Pikirkan seperti ini:
var x = (1 < 2) ? true : false;
Bisa juga ditulis sebagai:
var x = (1 < 2) ? getTrueValue() : getFalseValue();
Ini benar-benar valid, dan fungsi tersebut dapat berisi kode arbitrer apa pun, baik yang terkait dengan mengembalikan nilai atau tidak. Selain itu, hasil operasi terner tidak harus ditetapkan ke apa pun, sama seperti hasil fungsi tidak harus ditetapkan ke apa pun:
(1 < 2) ? getTrueValue() : getFalseValue();
Sekarang cukup ganti dengan fungsi sembarang, dan Anda akan mendapatkan sesuatu seperti contoh Anda:
(1 < 2) ? removeItem($this) : addItem($this);
Sekarang contoh terakhir Anda sama sekali tidak membutuhkan terner, karena bisa ditulis seperti ini:
x = (1 < 2); // x will be set to "true"
sumber
Jika Anda akan menggunakan operator terner bersarang, saya yakin Anda ingin melakukan sesuatu seperti ini:
var audience = (countrycode == 'eu') ? 'audienceEU' : (countrycode == 'jp') ? 'audienceJP' : (countrycode == 'cn') ? 'audienceCN' : 'audienceUS';
Jauh lebih efisien untuk menulis / membaca daripada:
var audience = 'audienceUS'; if countrycode == 'eu' { audience = 'audienceEU'; } else if countrycode == 'jp' { audience = 'audienceJP'; } else if countrycode == 'cn' { audience = 'audienceCN'; }
Seperti semua pemrograman yang bagus, whitespace membuat segalanya menyenangkan bagi orang-orang yang harus membaca kode Anda setelah Anda menyelesaikan proyek.
sumber
Saya tahu pertanyaan sudah terjawab.
Tapi izinkan saya menambahkan satu poin di sini. Ini bukan hanya kasus benar atau salah. Lihat di bawah:
var val="Do"; Var c= (val == "Do" || val == "Done") ? 7 : 0
Di sini jika val adalah Do atau Done maka c akan menjadi 7 selain itu akan menjadi nol. Dalam hal ini c akan menjadi 7.
Ini sebenarnya adalah perspektif lain dari operator ini.
sumber