Saya harus menulis rutin yang menambah nilai variabel dengan 1 jika tipenya adalah number
dan memberikan 0 ke variabel jika tidak, di mana variabel awalnya null
atau undefined
.
Implementasi pertama adalah v >= 0 ? v += 1 : v = 0
karena saya pikir sesuatu yang bukan angka akan membuat ekspresi aritmatika salah, tetapi itu salah karena null >= 0
dievaluasi benar. Kemudian saya belajar null
berperilaku seperti 0 dan ekspresi berikut semuanya dievaluasi menjadi benar.
null >= 0 && null <= 0
!(null < 0 || null > 0)
null + 1 === 1
1 / null === Infinity
Math.pow(42, null) === 1
Tentu saja, null
bukan 0. null == 0
dievaluasi salah. Ini membuat ekspresi yang tampaknya tautologis (v >= 0 && v <= 0) === (v == 0)
salah.
Mengapa null
seperti 0, meskipun sebenarnya bukan 0?
javascript
null
comparison
equality
C. Lee
sumber
sumber
null
atauundefined
:c = -~c // Results in 1 for null/undefined; increments if already a number
undefined
adalah nilai variabel, untuk variabel yang belum diinisialisasi.null
, di sisi lain, adalah nilai objek kosong, dan tidak boleh dicampur dengan angka.null
tidak boleh digabungkan dengan angka, jadi null tidak harus berperilaku seperti angka.Jawaban:
Pertanyaan Anda yang sebenarnya tampaknya:
Mengapa:
Tapi:
Apa yang sebenarnya terjadi adalah bahwa lebih besar-dari-atau-sama Operator (
>=
), melakukan jenis paksaan (ToPrimitive
), dengan sedikit jenisNumber
, sebenarnya semua operator relasional memiliki perilaku ini.null
diperlakukan dengan cara khusus oleh Operator Persamaan (==
). Singkatnya, itu hanya memaksa untukundefined
:Nilai seperti
false
,''
,'0'
, dan[]
tunduk jenis paksaan numerik, semua dari mereka memaksa ke nol.Anda dapat melihat detail bagian dalam proses ini dalam Algoritma Perbandingan Kesetaraan Abstrak dan Algoritma Perbandingan Hubungan Abstrak .
Singkatnya:
Perbandingan Relasional: jika kedua nilai bukan tipe String,
ToNumber
dipanggil keduanya. Ini sama dengan menambahkan+
di depan, yang untuk null koerces0
.Perbandingan Kesetaraan: hanya memanggil
ToNumber
Strings, Numbers, dan Booleans.sumber
null is treated in a special way by the Equals Operator (==). In a brief, it only coerces to undefined:
- dan apa? Bisakah Anda menjelaskan, mengapanull >= 0
? :)+
di depan, yang untuk null koerces0
. Kesetaraan hanya memanggil ToNumber on Strings, Numbers, dan Booleans.Saya ingin menyampaikan pertanyaan untuk lebih meningkatkan visibilitas masalah:
Itu tidak masuk akal. Seperti bahasa manusia, hal-hal ini perlu dipelajari dengan hati.
sumber
JavaScript memiliki perbandingan yang ketat dan konversi tipe
null >= 0;
itu benar tetapi(null==0)||(null>0)
salahnull <= 0;
itu benar tetapi(null==0)||(null<0)
salah"" >= 0
itu juga benarUntuk perbandingan abstrak relasional (<=,> =), operan pertama dikonversi ke primitif, kemudian ke tipe yang sama, sebelum perbandingan.
typeof null returns "object"
Ketika tipe objek javascript mencoba untuk merender objek (yaitu null) langkah-langkah berikut diambil ( ECMAScript 2015 ):
PreferredType
tidak lulus, biarkanhint
"default".PreferredType
adalahhint
String, biarkanhint
"string".PreferredType
adalahhint
Angka, biarlahhint
"angka".exoticToPrim
sajaGetMethod(input, @@toPrimitive)
.ReturnIfAbrupt(exoticToPrim)
.exoticToPrim
tidak ditentukan, makaa) Biarkan hasilnya
Call(exoticToPrim, input, «hint»)
.b)
ReturnIfAbrupt(result)
.c) Jika
Type(result)
bukan Objek, kembalikan hasil.d) Melempar pengecualian TypeError.
hint
"default", biarkanhint
"angka".OrdinaryToPrimitive(input,hint)
.Nilai yang diizinkan untuk petunjuk adalah "default", "number", dan "string". Objek tanggal, adalah unik di antara objek ECMAScript bawaan karena mereka memperlakukan "default" sebagai setara dengan "string". Semua objek ECMAScript bawaan lainnya memperlakukan "default" sebagai setara dengan "angka" . ( ECMAScript 20.3.4.45 )
Jadi saya pikir
null
mengkonversi ke 0.sumber
Saya punya masalah yang sama !!. Saat ini satu-satunya solusi saya adalah memisahkan.
sumber
if (a!=null && a>=0)
. Ini mengklarifikasi alasan untuk tidak hanya melakukan>=
sendiri: "a mungkin nol (atau tidak terdefinisi, yang juga '== null')".Secara matematis, itu aneh. Hasil terakhir menyatakan bahwa "nol lebih besar dari atau sama dengan nol", jadi dalam salah satu perbandingan di atas pasti benar, tetapi keduanya salah.
Alasannya adalah bahwa pemeriksaan kesetaraan
==
dan perbandingan> < >= <=
bekerja secara berbeda. Perbandingan mengonversi nol ke angka, memperlakukannya sebagai0
. Itu sebabnya (3)null >= 0
adalahtrue
dan (1)null > 0
adalahfalse
.Di sisi lain, cek kesetaraan
==
untukundefined
dannull
didefinisikan seperti itu, tanpa konversi, mereka sama satu sama lain dan tidak apa-apa sama lain. Itu sebabnya (2)null == 0
adalahfalse
.sumber