JS typeof null 为什么是object

简介: 我们从源码解析看这个问题 我们的JS 是 经过V8 引擎编译的 所以我们需要调试V8

为什么typeof null的结果是Object


null是基本类型 而object 是引用类型 这样就会存在矛盾


f4816e349a734b7f98a0366a90869cc0.png


我们从源码解析看这个问题 我们的JS 是 经过V8 引擎编译的 所以我们需要调试V8


安装工具 node版本要高


npm install -g jsvu


安装V8引擎


jsvu --os=win64 --engines=v8-debug
//os 根据自己的操作系统选择

ab908f85093c4a1d94ca9542fe8bf3ae.png


切换到用户目录下面的.jsvu


cf9a52921f9142c4838364bf2475f716.png


通过以下命令生成字节码


v8-debug -e --print-bytecode --allow-natives-syntax "var x = xxxx"

afa476702ef94362b76008af6f500d09.png


根据生成的字节码得出的结论


数据类型 机器码标识对象
(Object) 000
整数 1
浮点数 010
字符串 100
布尔 110
null 全为0


来看typeOf 源码


 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)) {  // (1)
            type = JSTYPE_VOID;
        } else if (JSVAL_IS_OBJECT(v)) {  // (2)
            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) // (3,4)
                 : ops->call != 0)) {  // (3)
                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;
    }


在判断数据类型时,是根据机器码低位标识来判断的,而null的机器码标识为全0,而对象的机器码低位标识为000。所以typeof null的结果被误判为Object

目录
相关文章
|
17天前
|
JavaScript 前端开发
JS中的typeof
`typeof`操作符在JavaScript中用于检测变量的数据类型。然而,它并非总是完全准确,如:数组和null被错误地标记为'object',NAN是'number',Symbol是'function',而Array也是'function'。注意`undefined`返回'undefined'。
|
17天前
|
JavaScript
js 字符串String转对象Object
该代码示例展示了如何将一个以逗号分隔的字符串(`'1.2,2,3,4,5'`)转换为对象数组。通过使用`split(',')`分割字符串并`map(parseFloat)`处理每个元素,将字符串转换成浮点数数组,最终得到一个对象数组,其类型为`object`。
|
24天前
|
JavaScript
Object.defineProperty(js的问题)
Object.defineProperty(js的问题)
|
26天前
|
JavaScript 前端开发
JavaScript中Object.prototype.toString.call()、instanceOf和Array.isArray()的区别
JavaScript中Object.prototype.toString.call()、instanceOf和Array.isArray()的区别
25 1
|
1月前
|
存储 JavaScript
JS中Map对象与object的区别
JS中Map对象与object的区别
|
1月前
|
JavaScript
JS之Object.defineProperty方法
JS之Object.defineProperty方法
|
1月前
|
JavaScript 前端开发 Java
编程笔记 html5&css&js 073 JavaScript Object数据类型
编程笔记 html5&css&js 073 JavaScript Object数据类型
|
1月前
|
JavaScript 前端开发 API
编程笔记 html5&css&js 070 JavaScript Null数据类型
编程笔记 html5&css&js 070 JavaScript Null数据类型
141 0
|
2月前
|
JavaScript 前端开发
JavaScript typeof、nul
JavaScript typeof、null和undefined是JavaScript编程中常用的三种类型。 typeof是JavaScript中的一个操作符,用于判断变量的类型。它的返回值是一个字符串,表示变量的数据类型。typeof的用法很简单,例如:typeof x,它会返回一个表示x的数据类型的字符串。typeof的返回值有六种,分别是:"undefined"、"boolean"、"string"、"number"、"object"和"function"。
11 1
|
5月前
|
Java
java判断Object对象是否为空demo
java判断Object对象是否为空demo