JS typeof null 为什么是object

为什么typeof null的结果是Object

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

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

安装工具 node版本要高

npm install -g jsvu

安装V8引擎

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

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

 通过以下命令生成字节码

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

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

数据类型 机器码标识对象
(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

猜你喜欢

转载自blog.csdn.net/qq1195566313/article/details/127483737
今日推荐