[JS认知记录]typeof--特异点:Null与Function

117 阅读3分钟

1.typeof null == "object" ? null 是对象吗 ?

众所周知,typeof是一个专门用来判断变量类型(基础数据类型和object类型)的操作符,但是使用的时候如果按他的返回结果去认知变量的类型,却会产生错误的知识理解.

就比如说null,其与undefined都是比较特殊的基本数据类型(原始值),null意味着空的或者不存在的值.

但是使用typeof语法去判定,我们会得到如下结果:

typeof null

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 的时候,我们会得到如下结果:

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世界的一等公民啊~只有不断的探索,才能发现那些耳熟能详的知识中又藏着些什么秘密.

希望大家都能够有所得~