1.typeof null == "object" ? null 是对象吗 ?
众所周知,typeof是一个专门用来判断变量类型(基础数据类型和object类型)的操作符,但是使用的时候如果按他的返回结果去认知变量的类型,却会产生错误的知识理解.
就比如说null,其与undefined都是比较特殊的基本数据类型(原始值),null意味着空的或者不存在的值.
但是使用typeof语法去判定,我们会得到如下结果:
null 的判定是对象!
这不是自相矛盾吗?
所以,为了见证真实,我们需要探究本源!
1.1. 历史的遗毒
经查,这是一个历史遗留问题:
在JavaScript的第一个实现版本中,JavaScript的值表现为类型标记和值,而0代表的类型就是Object,而null一般都表示为空指针(NULL pointer),在大多数平台中都表示为0x00,故而,null的类型标记也是0!也就是说会null被识别成Object!
当然,这么大的问题出现,肯定有人会去想修复他,有人就提出了一个修复草案,但是被拒绝了!(这个草案实现了typeof null === "null");
1.2 总结
JavaScript并不是一个完美的语言,他自然有他的不足,但是我们不可否认JavaScript确实造就了很多富有创造性的东西.在学习的过程中,我们更多要做的并不是死板的记忆他表现出来的一些东西,而是去追本溯源,得到其表现的根本原因,并逐渐成长到能够得知其全貌(知其优劣,知其所以然),我觉得对我们自身的成长来说才是更加具有意义的.
2.typeof Function === 'function' ? Function 不是对象吗 ?
在使用typeof的时候,我看到的操作符使用的对象的描述是:判定基础数据类型和object类型.
但是,在执行typeof Function 的时候,我们会得到如下结果:
2.1 function 是个什么类型?
function理论上来说,就是object类型的一种特殊形式,但是因为他有自己独特的行为和功能,所以其实也可以单独进行讨论认为是一种单独的数据类型.
Function:实现了
[[Call]]属性的对象,还有class定义本身,也是函数.
2.1.1 class为什么是函数 ?
因为在JavaScript世界中,并不存在像Java这样面向对象的语言一样具有真正意义上的Class,其class关键字实现其实是一种语法糖,实际上的是通过构造函数(本质上是function)实现的.
下面的两种定义class的方式是等价的.
// 使用 class 关键字定义类
class MyClass {
constructor() { // 类的构造函数 }
// 类的其他方法
}
// 使用构造函数定义类
function MyClass() {
// 构造函数
}
// 为构造函数添加其他方法
MyClass.prototype.method = function() {
// 方法
};
2.2 总结
函数也是对象,对象才是JavaScript世界的一等公民啊~只有不断的探索,才能发现那些耳熟能详的知识中又藏着些什么秘密.
希望大家都能够有所得~