为什么JavaScript里面typeof(null)的值是"object"?
参考ECMA手册
ECMAScript Language Specification,里面规定了typeof(null)的值是"object",但是为什么在有Null type的情况下不返回"null"呢?
添加评论
按投票排序
按时间排序
6 个回答
Null确实是一个非常特殊的类型,之前也有很多人反映过关于Null类型跟Undefined类型的问题,也有你提到的类似typeof检测的问题。
具体这个问题,因为Null类型只有一个值null,而一般是认为逻辑上认为null值表示一个空对象指针,所以用typeof的时候,会返回"object"。所以一般都会把null当做空对象的占位符。
至于为什么设计,我也没参加过ECMAscript的开发,相关资料中的说法也很多,有的说考虑到"null"跟null的区别。有的说因为设计时的局限,并且该部分影响不大,故没有重视之类的。
具体这个问题,因为Null类型只有一个值null,而一般是认为逻辑上认为null值表示一个空对象指针,所以用typeof的时候,会返回"object"。所以一般都会把null当做空对象的占位符。
至于为什么设计,我也没参加过ECMAscript的开发,相关资料中的说法也很多,有的说考虑到"null"跟null的区别。有的说因为设计时的局限,并且该部分影响不大,故没有重视之类的。
1. 娘胎里带出来的.
JS类型值是存在32 BIT 单元里,32位有1-3位表示TYPE TAG,其它位表示真实值
而表示object的标记位正好是低三位都是0
000: object. The data is a reference to an object.
而js 里的Null 是机器码NULL空指针, (0x00 is most platforms).所以空指针引用 加上 对象标记还是0,最终体现的类型还是object..
这也就是为什么Number(null)===0吧...
The history of “typeof null”
2. 曾经有提案 typeof null === 'null'.但提案被拒绝
harmony:typeof_null [ES Wiki]
JS类型值是存在32 BIT 单元里,32位有1-3位表示TYPE TAG,其它位表示真实值
而表示object的标记位正好是低三位都是0
000: object. The data is a reference to an object.
而js 里的Null 是机器码NULL空指针, (0x00 is most platforms).所以空指针引用 加上 对象标记还是0,最终体现的类型还是object..
这也就是为什么Number(null)===0吧...
The history of “typeof null”
2. 曾经有提案 typeof null === 'null'.但提案被拒绝
harmony:typeof_null [ES Wiki]