dalam javascript,
var a = '';
var b = (a) ? true : false;
var b
akan diatur ke false
.
Apakah ini perilaku yang dapat diandalkan?
javascript
string
boolean
cc muda
sumber
sumber
false
sini: jsfiddle.net/8CKbd''
dievaluasi menjadi false dalam konteks boolean jadi jikaa = '';
kemudiana ? false : true
=>'' ? false : true
=>false ? false : true
=>true
(karena evaluasi untuk nilai yang salah). Saya pikir itu harusvar b = (a) ? true : false;
benar dengan pernyataan berikutnya.Jawaban:
Iya. Javascript adalah dialek ECMAScript, dan spesifikasi bahasa ECMAScript jelas mendefinisikan perilaku ini:
Kutipan diambil dari http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
sumber
new String("")
benar! Ini karena itu adalah objek, sedangkan bentuk pendek""
mewakili versi nilai primitif. Hal yang sama berlaku untuknew Number(0)
dan bahkannew Boolean(false)
. Ini alasan yang baik untuk tidak menggunakan versi objek dalam kode Anda, dan itu berarti bahwaif (str.length)
menangani kasus tepi ini sedangkanif (str)
tidak.Iya. Semua
false
,0
, string kosong''
dan""
,NaN
,undefined
, dannull
selalu dievaluasi sebagaifalse
; yang lainnyatrue
.Dan dalam contoh Anda, b adalah
false
setelah evaluasi. (Saya pikir Anda salah menulistrue
)sumber
null
bukanfalse
, tidaktrue
,null
adalahnull
. jsfiddle.net/sq1Lkpg0NaN
danundefined
. Mereka bukanfalse
tapi mereka salah. Itulah yang ditanyakan.Seperti menjawab di atas, ya , itu adalah perilaku yang didefinisikan dari string kosong dalam bersyarat (sebuah
if
ekspresi,||
,&&
,? :
, ...). ( Standar mengatakan bahwa operasi internal ToBoolean harus diterapkan.)Evaluasi berbeda ketika string kosong digunakan dalam perbandingan (lihat Kebenaran, Kesetaraan, dan JavaScript ), meskipun hasilnya sebagian besar sama :
Penjelasan: Pada dasarnya, ketika operan
==
memiliki jenis yang berbeda, JavaScript berusaha keras untuk mengubahnya menjadi Angka, sesuai dengan nilainya , ( menggunakan operasi panggilan standar ToNumber dan ToPrimitive ), dan kemudian berlaku secara internal===
. Tetapi ketika Anda menggunakan===
secara langsung, tipe tidak dikonversi, jadi selalu membandingkan String dengan Booleanfalse
.Secara kasar, uji JavaScript conditionals ( ToBoolean ) untuk nilai yang ditentukan, tidak nol, tidak nol, tidak kosong, tidak palsu (String kosong ... kosong, Angka -0 atau +0 adalah ... nol, NaN bukan angka yang ditentukan, tetapi Obyek kosong ternyata tidak benar-benar kosong), atau seperti yang saya suka pikirkan, uji kondisional untuk hal (benar) , sambil
==
membandingkan nilai yang tampak, nilai yang dikonversi dengan cermat ( ToPrimitive , ToNumber ) dari operan, dan===
mencari kesamaan yang tepat .Ada lebih banyak contoh di Kebenaran, Kesetaraan dan JavaScript di mana perbedaan ini benar-benar penting, misalnya
'0'
adalahtrue
dalam bersyarat (non-nol panjang, atau, itu adalah hal ), tetapifalse
dalam==
perbandingan (yang nilai adalah nol).'1'
sekali lagi,true
dalam kedua kasus (itu adalah hal dan memiliki nilai bukan nol).sumber
var b
akan diatur ketrue
. Ini karena string kosong dihitung sebagai nilai 'falsey' dalam JavaScript seperti halnya beberapa nilai lainnya.Silakan lihat http://www.sitepoint.com/javascript-truthy-falsy/ untuk nilai falsy
sumber
var b
sebenarnya akan diatur ketrue
karena itu kebalikan darivar a
jika Anda melihat kode.sumber