Ich musste eine Routine schreiben, die den Wert einer Variablen um 1 erhöht, wenn ihr Typ ist, number
und der Variablen 0 zuweist, wenn nicht, wo die Variable anfänglich ist null
oder undefined
.
Die erste Implementierung war, v >= 0 ? v += 1 : v = 0
weil ich dachte, dass alles, was keine Zahl ist, einen arithmetischen Ausdruck falsch machen würde, aber es war falsch, da null >= 0
es als wahr ausgewertet wird. Dann habe ich gelernt, dass es null
sich wie 0 verhält und die folgenden Ausdrücke alle als wahr ausgewertet werden.
null >= 0 && null <= 0
!(null < 0 || null > 0)
null + 1 === 1
1 / null === Infinity
Math.pow(42, null) === 1
Natürlich null
ist nicht 0. null == 0
wird als falsch bewertet. Dies macht den scheinbar tautologischen Ausdruck (v >= 0 && v <= 0) === (v == 0)
falsch.
Warum ist null
wie 0, obwohl es eigentlich nicht 0 ist?
javascript
null
comparison
equality
C. Lee
quelle
quelle
null
oderundefined
:c = -~c // Results in 1 for null/undefined; increments if already a number
undefined
ist ein Variablenwert für Variablen, die nicht initialisiert wurden.null
ist andererseits ein leerer Objektwert und sollte nicht mit Zahlen gemischt werden.null
sollte nicht mit Zahlen kombiniert werden, daher sollte sich null nicht wie Zahlen verhalten müssen.Antworten:
Ihre eigentliche Frage scheint zu sein:
Warum:
Aber:
Was wirklich passiert, ist, dass der Operator "Größer als oder gleich" (
>=
) einen Typzwang ( ) ausführtToPrimitive
, mit einem Hinweis vom TypNumber
, tatsächlich haben alle relationalen Operatoren dieses Verhalten.null
wird vom Equals Operator (==
) in besonderer Weise behandelt . Kurz gesagt , es zwingt nur zuundefined
:Wert wie
false
,''
,'0'
und[]
unterliegt numerischen Typ Zwang, alle von ihnen auf Null zwingen.Sie können die inneren Details dieses Prozesses im abstrakten Gleichheitsvergleichsalgorithmus und im abstrakten relationalen Vergleichsalgorithmus sehen .
Zusammenfassend:
Relationaler Vergleich: Wenn beide Werte nicht vom Typ String sind,
ToNumber
wird für beide aufgerufen. Dies ist das gleiche wie das Hinzufügen eines+
Front, das für Null erzwingt0
.Gleichheitsvergleich:
ToNumber
Ruft nur Zeichenfolgen, Zahlen und Boolesche Werte auf.quelle
null is treated in a special way by the Equals Operator (==). In a brief, it only coerces to undefined:
- und was? Können Sie erklären, warumnull >= 0
? :)+
Front, das für Null erzwingt0
. Equality ruft ToNumber nur für Zeichenfolgen, Zahlen und Boolesche Werte auf.Ich möchte die Frage erweitern, um die Sichtbarkeit des Problems weiter zu verbessern:
Es macht einfach keinen Sinn. Wie menschliche Sprachen müssen diese Dinge auswendig gelernt werden.
quelle
JavaScript bietet sowohl strenge als auch typkonvertierende Vergleiche
null >= 0;
ist wahr, aber(null==0)||(null>0)
falschnull <= 0;
ist wahr, aber(null==0)||(null<0)
falsch"" >= 0
ist auch wahrBei relationalen abstrakten Vergleichen (<=,> =) werden die Operanden vor dem Vergleich zunächst in Grundelemente und dann in denselben Typ konvertiert.
typeof null returns "object"
Wenn der Typ Objekt ist, versucht Javascript, das Objekt zu stringifizieren (dh null), werden die folgenden Schritte ausgeführt ( ECMAScript 2015 ):
PreferredType
nicht bestanden wurde, seihint
"Standard".PreferredType
isthint
String, lassenhint
"string" sein.PreferredType
isthint
Nummer, seihint
"Nummer".exoticToPrim
seinGetMethod(input, @@toPrimitive)
.ReturnIfAbrupt(exoticToPrim)
.exoticToPrim
nicht undefiniert ist, danna) Sei das Ergebnis
Call(exoticToPrim, input, «hint»)
.b)
ReturnIfAbrupt(result)
.c) Wenn
Type(result)
nicht Object, Ergebnis zurückgeben.d) Wirf eine TypeError-Ausnahme aus.
hint
"Standard" ist, seihint
"Nummer".OrdinaryToPrimitive(input,hint)
.Die zulässigen Werte für den Hinweis sind "Standard", "Nummer" und "Zeichenfolge". Datumsobjekte sind unter den integrierten ECMAScript-Objekten insofern einzigartig, als sie "Standard" als äquivalent zu "Zeichenfolge" behandeln. Alle anderen integrierten ECMAScript-Objekte behandeln "Standard" als gleichwertig mit "Nummer" . ( ECMAScript 20.3.4.45 )
Also ich denke
null
konvertiert in 0.quelle
Ich hatte das gleiche Problem !!. Derzeit ist meine einzige Lösung zu trennen.
quelle
if (a!=null && a>=0)
. Dies verdeutlicht den Grund dafür, nicht einfach>=
von selbst zu tun : "a könnte null sein (oder undefiniert, was auch '== null' ist)".Mathematisch ist das seltsam. Das letzte Ergebnis besagt, dass "null größer oder gleich Null ist", daher muss es in einem der obigen Vergleiche wahr sein, aber beide sind falsch.
Der Grund ist, dass eine Gleichstellungsprüfung
==
und Vergleiche> < >= <=
unterschiedlich funktionieren. Vergleiche wandeln null in eine Zahl um und behandeln sie als0
. Aus diesem Grund (3)null >= 0
isttrue
und (1)null > 0
istfalse
.Andererseits wird die Gleichheitsprüfung
==
fürundefined
undnull
so definiert, dass sie sich ohne Konvertierungen gleichen und nichts anderes entsprechen. Aus diesem Grund (2)null == 0
istfalse
.quelle