JavaScript中判定数据属于原始类型还是对象类型的依据是什么
核心结论先放前面:
JavaScript中对象类型和原始类型的划分有明确的核心判定标准,typeof null === 'object'只是历史遗留bug,完全不影响null的原始类型归属。
原始类型 vs 对象类型的核心区别:
- 可变性不同:原始值本身是不可修改的,所有对原始值的操作都会返回新的原始值,不会修改原值;对象是可变引用类型,你可以任意修改同一个对象的属性、方法,修改的是引用指向的实际内容。
- 比较逻辑不同:原始类型按值比较,只要值相等,全等判断就返回
true,比如1 === 1、'test' === 'test'都为真;对象按引用比较,哪怕两个对象的属性完全一致,只要不是同一个内存地址的引用,全等判断就返回false,比如{} === {}结果为false。 - 属性持有能力不同:原始类型本身不会持有任何属性和方法,你平时看到的
'abc'.toUpperCase()这类调用,本质是JS临时创建了对应包装类(String、Number、Boolean)的实例,调用完方法立刻就销毁了临时对象,所以你给原始值加属性根本留不住:
而对象本身可以持有自定义属性和方法,添加的属性会一直保存在对象实例上。let num = 1; num.test = 2; console.log(num.test); // 输出 undefined,临时对象已经被销毁
回到null的类型问题
你提到的「无法给null添加属性」确实是它属于原始类型的直接表现之一,但不是唯一判定依据:
- 你可以直接测试给
null加属性,会直接抛出错误,连临时包装对象的逻辑都不会触发,完全不具备对象的属性持有能力 null完全符合原始类型的比较逻辑:null === null返回true,如果它是对象的话,两个不同的null实例按引用比较应该返回falsenull本身是不可变的,不存在任何修改null本身值的可能
如果假设null真的是对象类型,就意味着它要满足所有对象的特征:可以自由添加删除属性、按引用比较、支持修改自身内容,这和当前JavaScript中null的实际表现完全矛盾。
至于typeof null === 'object'的bug,是JS首个版本的实现缺陷:当时值的类型信息存在低3位,000代表对象类型,而null在实现中是全0的空指针,刚好命中了对象的类型标签,后来为了兼容旧版代码就一直没有修复这个表现,和null本身的类型归属没有任何关系。
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

