当前位置:首页 > Web开发 > 正文

【JS】类型检测

11-05 Web开发

js 中的类型检测也是很重要的一部分,所以说这篇文章我们就来讲一下怎么对 JavaScript 中的基本数据类型进行检测。其实这也是在读 Zepto 源码中学习到的,所以阅读源码对我们的提升还是很有帮助的。本文基于参考了前辈们的文章之后个人理解此文写的有不当的地方,请各位大佬指正。

其实常规方法主要有四种

typeof

instanceof

Object.prototype.toString

construcor

其实这四种方式归根结底就是两种思路:

根据数据类型判断(1,2)

根据构造函数判断(3,4)

前置基础

再看 Zepto 之前看了 慕课网一个老师的视频,一共一个小时左右,开了快进估计也就 45 分钟左右。只是讲了 Zepto 的架构和设计,没有详细的将每一个方法,初看之前可以看一下,对 Zepto 有一个大概的印象。

原型与原型链

其实这部分真的是老生常谈的问题,但是每一次听其他人都有新的收获。真的是不想写这部分,但是自我感觉整体思路比较清晰,所以推荐大家阅读一下。

Zepto 整个的设计思想其实是基于 js 的原型链。关于原型链,这个老师讲的比较清晰,需要记住三句话:

每一个函数,都有一个 prototype 属性。

所有通过函数 new 出来的对象,这个对象都有一个 __proto__ 指向这个函数的 prototype。

当你想要使用一个对象(或者一个数组)的某个功能时:如果该对象本身具有这个功能,则直接使用;如果该对象本身没有这个功能,则去 __proto__ 中找。

什么是 prototype(显示原型)

每一个函数在创建之后都会拥有一个名为 prototype 的属性,这个属性指向函数的原型对象。通过Function.prototype.bind方法构造出来的函数是个例外,它没有prototype属性。

var fn = function() {} console.log( fn.prototype );

通过下面这幅图我们可以看出创建一个函数时,都会有一个 prototype 属性指向它的原型。而 fn.prototype 中有一个 constructor 属性指向 fn 函数。

技术图片

原型图

什么是 __proto__(隐式原型)

JavaScript 中任意对象都有一个内置属性 __proto__,隐式原型指向创建这个对象的函数(constructor)的 prototype。

Object.prototype 这个对象是个例外,它的 __proto__ 值为 null

console.log( typeof Array ); // ‘function‘ console.log( Array.prototype );

数组构造函数 Array 也是一个函数,并且在 Array 的原型中除了指向 Array 的 constructor 之外还有其他的内置对象。

__proto__ 的指向

上面应该都不难理解,主要是 __proto__ 的指向,这个问题是比较难理解的,我们来看刚刚的定义,__proto__ 指向创建这个对象的函数的显式原型。创建函数一共有三种方式:

字面量方式

var person1 = { name: ‘cyl‘, sex: ‘male‘ };

字面量的方式是一种为了开发人员更方便创建对象的一个语法糖,本质就是

var o = new Object(); o.xx = xx; o.yy=yy;

所以说使用字面量方式创建的函对象的 __proto__ 属性是指向 Object.prototype 的。

构造函数
所谓的构造函数,就是通过 new 关键字调用的函数,只要是通过 new 关键字调用的函数都是构造函数。由构造函数构造的对象,其 __prototype__ 指向其构造函数的 prototype 属性指向的对象。

var arr = new Array()

比如 arr 是一个实例化的数组,那么 arr 的 __proto__ 属性就指向 Array 的 prototype 属性。

技术图片

原型图

函数通过 Object.create 构造的

var person1 = { name: ‘cyl‘, sex: ‘male‘ }; var person2 = Object.create(person1);

Object.create 的内部其实是这样的:

function object(o){ function F(){} F.prototype = o; return new F() }

也可以看成是通过 new 创建的。所以说我们就可以一目了然,person2 的 __proto__ 是指向 person1 的。(注意,是直接指向 person1,而不是 person1.prototype)。

prototype 和 __proto__ 的作用

在了解了什么是显示原型 prototype 和隐式原型 __proto__ 之后,我们也知道了怎么去找隐式原型,那么它们有什么作用呢?

显式原型的作用:用来实现基于原型的继承与属性的共享。

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/web/10099.html