JavaScript即学即用教程[1]-类型系统

基本类型

Number, Boolean, String, null, undefinedjavascript

什么样的变量是 undefined

  1. 声明了变量却没赋值
  2. 未声明的变量

包装类型

其实js里面也有像java,c#里所谓的包装类型前端

var a = 123
var b = a.toString()

请问a既然是一个简单的基本类型,内存栈上的4个字节的数字类型,为何有toString方法呢?
显然,这里也发生了包装,其过程大概是这样的:java

var tmp = new Number(a)
var b = tmp.toString()

引用类型

JS中一切皆对象,咱们能够统称为除了基本类型的这些其余元素,都叫作对象。由于他们均可以有自身的属性、自身的方法。c#

不过,从面向对象的角度来看,咱们仍是应该像学习Java那样,对js里的对象进行一下划分。我对js里的类型划分是这样的定义的:函数

除了基本类型,都是引用类型。引用类型有内置的如Date,Array,Object等,也有本身建立的类型如Person, Dog等等。

然而,js又是一个偏函数式的语言,那么,在js里函数承担什么角色呢。学习

  1. 它其实既能当作构造函数建立一个类的定义,如Dog
  2. 又能当作一个全局函数,来提供给别人使用。如parseInt。固然,全局其实也能够看作是window对象的一个方法:window.parseInt
  3. 函数又能当作一个对象的方法,像其余面向对象语言那样,如arr.slice()
  4. 函数还能做为参数传递,像不少函数式语言同样。如arr.map(function (item,index) {})

因此,JavaScript既能搞得来面向对象,又能充分发挥函数的灵活性,岂不美哉。ui

类型判断

typeof可以返回的结果只有: 'undefined', 'bollean', 'number', 'string','object','function'
可见,包含了基本类型的全部类型,除了null,null这种基本类型会被断定为'object',而其余全部引用类型也会被断定为'object'或'function'.spa

所以,使用typeof能够用来断定基本类型中的 stirng, number, boolean, undefinedprototype

而遇到引用类型,则须要用更严格的方法来断定:code

  • instanceof 能够断定一个引用类型是否属于某个类型。而全部引用类型其实都继承自Object,因此任何引用类型instanceof Object都是true。

个人总结

其实JavaScript中,就只有基本类型和其余类型。而其余类型都有一个公共的父类,叫作Function类型。哪怕Js中的Object,也是Function类型的一个实例。

Function类型的实例比较特殊,由于Function类型的实例仍是一个Function,好比Object、Array、Date都是Function类型的实例。因此JS中,Function的实例,才至关于其余语言当中的类,class

重点来了

因为Array、Date,都是从Function继承而来,因此他们都会继承/享有Function.prototype上的东西。
而Array、Date的实例,都是从Array、Date继承而来,所以实例会继承Array或Date的prototype上的东西.
然而,实例却跟Function没有任何关系,由于js中继承是依靠原型继承的,Array.prototype跟Function扯不上关系,那Array的实例也跟Function没有半毛钱关系。如图:

反而, 因为Array、Date这些class的prototype都是继承自Object,因此原型链拐向了Object。所以var arr = new Array()这样一个实例,他顺着原型链是找到了Object.prototype. 如图:

选学内容

若是咱们刨根问底,去寻找Object和Function的根源的话,那这个问题又稍微有点复杂了。

咱们知道Object类型,是继承自Function.prototype的, Array是继承自Object.prototype。而Object.prototype继承自谁呢?

答案是Object.prototype是继承自null

而Function继承自本身的Function.prototype, 即:
Function.__proto__ == Function.prototype

Function.prototype 却不是一个对象,而是一个函数, 但奇特的是Function.prototype这个函数并无prototype属性,只知道该函数继承自Object.prototype (因此这个函数怎么造出来的呢?居然继承自一个对象,看来是这里揭示了为什么js里一切皆对象把,连Function往上找源头都最终找到它继承自Object.prototype)

因此,最终的结果如图所示:

再上一张比较全的图:

这张图上少画了一笔,最上方的空函数,其__proto__也应该指向Object.prototype,。

因此,js中全部类型的根源,居然是Object.prototype顶上的那个null....

而typeof null 又是 'object',因此在js当中,一切皆对象!!!

没了

本文同步发表在 知乎专栏 青檬前端个人博客

相关文章
相关标签/搜索