制作网站副本,建站设计,东阳网站制作,wordpress 修订版本号前言
本文主要讲解JavaScript如何手写一个简易的instanceof,从而实现数据类型判断的作用.那么好,本文正式开始.
instanceof作用
instanceOf的作用就是用来判断JavaScript中的数据类型是否是开发所输入的那种, 语法格式:obj instanceof objtype 左侧就是要判断的数据,而右侧就…前言
本文主要讲解JavaScript如何手写一个简易的instanceof,从而实现数据类型判断的作用.那么好,本文正式开始.
instanceof作用
instanceOf的作用就是用来判断JavaScript中的数据类型是否是开发所输入的那种, 语法格式:obj instanceof objtype 左侧就是要判断的数据,而右侧就是开发输入的它的数据类型,instanceof就是判断它输入的这两个数据类型是否相同.它只能判断复杂类型,因为它是通过对象的原型和右侧的原型是否相等来判断,而基本数据类型没有原型所以只能返回false,它的返回值是true或者false.我们通过一段代码实例来更好的理解instanceOf的作用及其返回值.
let arr[1,2,3]
let person123
console.log(arr instanceof Array);
console.log(person instanceof String);作用一共就两点:
可以判断该数据是复杂数据类型还是基本数据类型,通过右侧值为Object来进行判断判断某个复杂数据类型是否是开发所输入的那种对象.
手写思路
创建一个函数这个函数有两个参数,第一个为想要判断的那个实例,另一个为被判断的对象因为它对于所有简单数据类型都返回false,但是string/boolean/number都有包装对象类型,可以被认为它们也有原型,但它们本身仍然不被instanceof所认可,那么需要用typeof对左侧实例对象是否为上述三个类型进行判断,如果是,直接返回false如果不是它们,则创建两个变量,分别用getPrototypeOf来获取它们的原型,因为它们的原型有一个原型链,所以需要用while循环,当不成功且没有追溯到实例的最上层原型时,则继续向上追溯.比如,一个person class中有一个person对象.
全部源码
function Handle(obj, type) {// 因为string、number、boolean可以new一个包装对象作为基本数据类型它们也有原型链为了避免这种情况typeof// 检查出是它们则直接出局如果不是则需要调用getPrototypeOf方法来进行原型链的获取判断这个实参是否有原型if(typeof(obj)!stringtypeof(obj)!booleantypeof(obj)!numberObject.getPrototypeOf(obj)){// 如果有则赋值给objLeftlet objLeft Object.getPrototypeOf(obj); // 调用type构造函数中的原型赋值给typeRightlet typeRightObject.getPrototypeOf(type);// 条件循环当满足下述两个条件之一跳出循环// 不满足则不断调用objLeft上层的原型直至是null或和类原型一致。因为原型的尽头是null。while(true){if (objLeft null) return false;if (typeRight objLeft) return true;// 不断向上追溯对象的原型链直到为null或匹配objLeftObject.getPrototypeOf(objLeft)}}else{return false;}}