Di JS Anda dapat mengembalikan Boolean yang memiliki properti khusus. Misalnya. ketika Modernizr menguji dukungan video, ia mengembalikan true
atau false
tetapi Boolean yang dikembalikan (Bool adalah objek kelas satu di JS) memiliki properti yang menentukan format apa yang didukung. Pada awalnya itu sedikit mengejutkan saya tetapi kemudian saya mulai menyukai ide itu dan mulai bertanya-tanya mengapa itu tampaknya digunakan dengan hemat?
Sepertinya cara yang elegan untuk berurusan dengan semua skenario di mana Anda pada dasarnya ingin tahu apakah sesuatu itu benar atau salah tetapi Anda mungkin tertarik pada beberapa info tambahan yang dapat Anda tetapkan tanpa mendefinisikan objek pengembalian kustom atau menggunakan fungsi panggilan balik yang disiapkan untuk menerima lebih banyak parameter. Dengan cara ini Anda mempertahankan fungsi tanda tangan yang sangat universal tanpa mengurangi kapasitas untuk mengembalikan data yang lebih kompleks.
Ada 3 argumen yang menentangnya yang bisa saya bayangkan:
- Agak jarang / tidak terduga ketika mungkin lebih baik untuk setiap antarmuka menjadi jelas dan tidak rumit.
- Ini mungkin argumen orang bodoh, tetapi dengan itu menjadi sedikit kasus tepi saya bisa membayangkan diam-diam menjadi bumerang di beberapa pengoptimal JS, uglifier, VM atau setelah perubahan spesifikasi bahasa pembersihan kecil dll.
- Ada yang lebih baik - ringkas, jelas dan umum - cara melakukan hal yang persis sama.
Jadi pertanyaan saya adalah adakah alasan kuat untuk menghindari menggunakan Boolean dengan properti tambahan? Apakah itu tipuan atau hadiah?
Plot tikungan peringatan.
Di atas adalah pertanyaan asli dengan penuh kemuliaan. Seperti yang ditunjukkan oleh Matthew Crumley dan senevoldsen, itu didasarkan pada premis yang salah (salah?). Dalam tradisi JS yang bagus apa yang dilakukan Modernizr adalah trik bahasa dan yang kotor. Itu bermuara pada JS yang memiliki bool primitif yang jika disetel ke false akan tetap salah bahkan setelah MENCOBA untuk menambahkan alat peraga (yang gagal diam-diam) dan objek Boolean yang dapat memiliki alat peraga khusus tetapi menjadi objek selalu benar. Modernizr mengembalikan boolean false atau objek Boolean yang sebenarnya.
Pertanyaan awal saya mengasumsikan triknya bekerja secara berbeda dan sebagian besar jawaban populer berhubungan dengan aspek standar pengkodean (yang benar-benar valid). Namun saya menemukan jawaban yang membantah seluruh trik ini sangat membantu (dan juga argumen terakhir yang menentang penggunaan metode ini) jadi saya menerima salah satunya. Terima kasih untuk semua peserta!
null
jika tidak didukung dan berbagai format jika demikian. Daftar dianggap benar di JS, dannull
palsu.Jawaban:
Selain prinsip-prinsip desain umum, seperti tanggung jawab tunggal, dan paling tidak mengejutkan, ada alasan khusus JavaScript bahwa itu bukan ide yang baik: ada perbedaan besar antara a
boolean
danBoolean
dalam JavaScript yang mencegahnya bekerja dalam kasus umum.boolean
adalah tipe primitif, bukan objek, dan tidak dapat memiliki properti khusus. Ekspresi sukatrue.toString()
bekerja karena di belakang layar, itu berubah menjadi(new Boolean(true)).toString()
.Boolean
(dengan huruf B) adalah objek, tetapi memiliki sedikit kegunaan yang baik, dan digunakan sebagaiboolean
jelas bukan salah satunya. Alasan untuk itu adalah, bahwa setiapBoolean
"benar", terlepas dari nilainya , karena semua objek dikonversi ketrue
dalam konteks boolean. Misalnya, coba ini:Jadi, secara umum, tidak ada cara untuk menambahkan properti ke boolean dalam JavaScript yang masih memungkinkannya berperilaku secara logis. Modernizr bisa lolos begitu saja karena hanya menambah properti ke nilai "true", jenis pekerjaan seperti yang Anda harapkan (yaitu mereka bekerja dalam pernyataan if). Jika video tidak didukung sama sekali,
Modernizr.video
akan menjadi aktualboolean
(dengan nilaifalse
), dan tidak dapat menambahkan properti ke dalamnya.sumber
true
dalam kondisi. Mengapa menggunakan secara eksplisitBoolean
?false
itu benar-benar 'palsu' dan palsu (===
dan==
berfungsi sebagai) TAPI memang Anda sebenarnya tidak dapat menambahkan alat peraga ke bool primitif. Perbedaan antara Bool dan bool ternyata membuat saya bingung.TypeError
jika Anda mencoba menambahkan properti (lihat jsbin.com/yovasafibo/edit?js,console ).Selamat, Anda telah menemukan benda. Alasan untuk tidak melakukan ini disebut prinsip ketakjuban . Terkejut dengan desain bukanlah hal yang baik.
Tidak ada yang salah dengan menggabungkan informasi ini tetapi mengapa Anda ingin menyembunyikannya di Bool? Masukkan ke dalam sesuatu yang Anda harapkan memiliki semua informasi ini. Termasuk bool.
sumber
Argumen utama yang saya pegang terhadapnya adalah, prinsip tanggung jawab tunggal , seorang boolean seharusnya hanya mengatakan jika sesuatu itu
true
ataufalse
, bukan mengapa atau bagaimana atau hal lainnya. Adalah keyakinan dan praktik saya yang teguh bahwa benda-benda lain harus digunakan untuk mengomunikasikannya atau informasi lainnya.sumber
Boolean
Meskipun demikian, kekurangan JavaScript .Karena seluruh alasan itu disebut nilai boolean adalah fakta itu benar atau salah, saya tidak suka ide itu, karena Anda cukup banyak merusak seluruh tujuannya dari wikipedia
(huruf tebal saya)
sumber
Hanya karena Anda tidak dapat berarti Anda harus melakukannya, di JS Anda dapat cukup banyak melampirkan properti ke objek apa pun (termasuk Boolean)
Bagaimana itu hal yang buruk?
Di satu sisi, Anda dapat melampirkan lebih banyak data yang tidak relevan ke Boolean (per contoh Anda), sesuatu yang tidak diharapkan oleh pengembang lain karena mengapa harus ada di sana ?! bools hanya untuk benar dan salah.
Titik baliknya adalah melampirkan beberapa properti berguna yang relevan yang dapat membantu Anda menangani nilai boolean ( Java melakukan itu ).
Misalnya, Anda dapat melampirkan fungsi yang mengubah nilai boolean menjadi string,
dirty
bendera yang berubah benar jika nilai diubah, pengamat dan callback peristiwa yang dapat diaktifkan ketika nilai diubah dll.Kedengarannya seperti sesuatu yang tidak boleh disimpan dalam Boolean, melainkan menggunakan Set boolean, atau Set properti dengan boolean di dalamnya. Saya pikir pendekatan yang lebih baik adalah mengembalikan objek dengan semua format dan detail dukungan.
sumber
Anda tidak dapat membuat boolean dengan properti khusus di JavaScript. Gagal berikut (setidaknya dalam FF):
Anda dapat menggunakan, atau mewarisi dari Boolean, tetapi seperti yang dikatakan Matthew Crumley itu memberikan hasil yang berbeda.
Boolean
adalah tipeObject
. Ketika JS membutuhkan nilai boolean dari ekspresi yang dikonversikan menggunakan fungsi spesifikasiToBoolean
, yang mengamanatkan bahwa untukObject
hasilnya selalutrue
. Dengan demikian nilainew Boolean(false)
dievaluasi menjaditrue
! Anda dapat memverifikasi ini dalam contoh ini: https://jsfiddle.net/md7abx5z/3/ .Satu-satunya alasan ia bekerja untuk Modernizr adalah insidental. Mereka hanya membuat
Boolean
objek ketika kondisinya benar. Ketika mereka menilai salah mereka hanya kembali biasafalse
. Jadi itu berhasil karena mereka hanya mengembalikanBoolean
objek ketika hasilnya benar, dan tidak pernah ketika itu salah.sumber
Saya mengerti konteksnya telah berubah, tetapi saya ingin menjawab pertanyaan asli yang saya baca menggunakan JS sebagai contoh, tetapi tidak terbatas pada JS saja.
Menambahkan properti ke boolean, tidak akan menjadi masalah JIKA properti itu ada hubungannya dengan true / false, bukan dengan variabel yang menyimpan nilai. Sebagai contoh, menambahkan metode toYesNoString akan baik-baik saja, menambahkan numberOfChildren ke nilai hasChildren tidak, dan tidak akan pertanyaan. Tidak banyak yang bisa Anda tambahkan ke boolean, selain berbagai repesentasi string, satu-satunya properti yang dapat saya pikirkan yang masuk akal adalah originalExpression. Namun menambahkannya tidak selalu merupakan ide buruk dalam teori.
sumber
Jika saya melihat kode ini bukan tentang memberikan properti kustom Boolean tetapi tentang metode yang memiliki metode pengembalian dengan tanda tangan yang berbeda.
Jika itu salah maka Anda mendapatkan primitif salah dan jika itu benar itu mengembalikan objek yang menurut definisi ditafsirkan sebagai benar dalam javascript.
Jadi, menurut saya pertanyaan Anda tidak boleh apakah itu ide yang baik untuk memberikan properti kustom Boolean tetapi apakah itu ide yang baik untuk memiliki metode dengan tanda tangan kembali ganda.
sumber
Dalam contoh yang diberikan, tidak bisakah Anda mengembalikan array dari semua format video yang didukung?
Paling tidak saya akan mengatakan bahwa menggunakan array agak kurang mengejutkan daripada memiliki "custom booleans".
Dalam Javascript, array kosong bahkan dianggap falsy , sedangkan array non-kosong truthy , sehingga dengan sedikit keberuntungan Anda hanya bisa beralih ke array dan semuanya akan bekerja seperti sebelumnyamengedit Tidak, konyol saya untuk berpikir aku bisa ingat truthiness yang objek dalam JavaScript: Psumber
""
memiliki tipe"string"
tetapi sebenarnya palsu[].length
apakah falsey jika panjang0
, tidak lebih banyak mengetik, dan menurut saya merupakan indikasi niat yang lebih baik daripada hanyaif([])
jika itu berhasil.