Wissen Sie wirklich, warum das Ergebnis von typeof 'object' ist?

Wissen Sie wirklich, warum das Ergebnis von typeof 'object' ist?

Bisher sind im ECMAScript-Standard 8 Datentypen definiert: Undefiniert, Null, Zahl, Boolescher Wert, Zeichenfolge, Symbol, BigInt und Objekt.
Um den Datentyp der Variablen zu bestimmen, stellt JavaScript auch den Operator typeof bereit .
Der Wert im Datentyp entspricht dem Ausgabewert nach der Operation des Operatortyps:

Art der Daten Wert Ergebnis
Nicht definiert nicht definiert 'nicht definiert'
Null Null 'Objekt'
Nummer 1、1.0 、 NaN 、 Unendlichkeit 'Nummer'
Boolescher Wert wahr falsch 'boolean'
String '' 、 'Abc' 'string'
Symbol Symbol () 、 Symbol ('123') 'Symbol'
BigInt 0n 、 1n 'bigint'
Objekt {} 、 [] 'Objekt'
Objekt Funktion(){} 'Funktion'

Durch Beobachtung können wir ein Problem finden - der Operator typeof beurteilt einen primitiven Typwert null fälschlicherweise als Objekt

typeof null === 'object'//true

Dies führt dazu, dass der Typ x === 'Objekt', x kann auch null sein

Dieses Problem kann auf die erste Version von JavaScript 1 zurückgeführt werden. In dieser Version belegt ein einzelner Wert eine 32-Bit-Speichereinheit im Stapel, und die 32-Bit-Speichereinheit kann in Typ-Tags ( 1-3 Bit) unterteilt werden ) Und die tatsächlichen Daten, die Typenbezeichnung, werden in den unteren Bits gespeichert, die in 5 Typen unterteilt werden können:

(1)
Bild aus dem Programmiermodus des Rechners von window10
Wie in Abbildung 2 gezeigt , beurteilt der Typof den Typ als " Objekt " , wenn das 0., 1. und 2. Bit alle 0 sind .

(2)
Bild aus dem Programmiermodus des Rechners von window10
Wie in Abbildung 2 gezeigt , beurteilt typeof den Typ als " Zahl (Ganzzahl) " , wenn das 0. Bit 1 ist .

(3)
Fügen Sie hier eine Bildbeschreibung ein
Wie in Fig. 2 gezeigt , ist der Typ des Beurteilungstyps " Nummer (Gleitkomma) " , wenn das 0. und 2. Bit beide 0 sind und das 1. Bit 1 ist ;

(4)
Fügen Sie hier eine Bildbeschreibung ein
Wie in Fig. 2 gezeigt , beurteilt der Typof den Typ als " Zeichenfolge " , wenn das 0. Bit und das 1. Bit beide 0 sind und das 2. Bit 1 ist ;

(5)
Fügen Sie hier eine Bildbeschreibung ein
Wie in Fig. 2 gezeigt , beurteilt typeof den Typ als " boolesch " , wenn das erste und das zweite Bit beide 1 sind und das 0. Bit 0 ist ;

Darüber hinaus gibt es zwei Sonderfälle:
undefiniert: Ganzzahl −2 ^ 30 (Zahl außerhalb des Bereichs der Ganzzahl)
null: Die Ziffern 0 bis 31 sind alle 0 (Es erfüllt nur die Bedingung, dass typeof den Typ als " Objekt " beurteilt , wenn das 0., 1. und 2. Bit alle 0 sind)

Der folgende Code veranschaulicht dieses Problem ( Quelle ) besser :

JS_PUBLIC_API(JSType)
    JS_TypeOfValue(JSContext *cx, jsval v)
    {
    
    
        JSType type = JSTYPE_VOID;
        JSObject *obj;
        JSObjectOps *ops;
        JSClass *clasp;

        CHECK_REQUEST(cx);
        if (JSVAL_IS_VOID(v)) {
    
    
            type = JSTYPE_VOID;
        } else if (JSVAL_IS_OBJECT(v)) {
    
    
            obj = JSVAL_TO_OBJECT(v);
            if (obj &&
                (ops = obj->map->ops,
                 ops == &js_ObjectOps
                 ? (clasp = OBJ_GET_CLASS(cx, obj),
                    clasp->call || clasp == &js_FunctionClass) 
                 : ops->call != 0)) {
    
     
                type = JSTYPE_FUNCTION;
            } else {
    
    
                type = JSTYPE_OBJECT;
            }
        } else if (JSVAL_IS_NUMBER(v)) {
    
    
            type = JSTYPE_NUMBER;
        } else if (JSVAL_IS_STRING(v)) {
    
    
            type = JSTYPE_STRING;
        } else if (JSVAL_IS_BOOLEAN(v)) {
    
    
            type = JSTYPE_BOOLEAN;
        }
        return type;
    }

Aus diesem Grund ist typeof null === 'object' wahr.


  1. Derzeit gibt es kein Symbol und kein BigInt, daher werden sie nicht diskutiert. ↩︎

  2. Das Bild stammt aus dem Windows10-Rechner-Programmiermodus: ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

Ich denke du magst

Origin blog.csdn.net/qq_35508835/article/details/108299244
Empfohlen
Rangfolge