博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用Object.prototype.toString.call()来进行类型检验
阅读量:6263 次
发布时间:2019-06-22

本文共 2114 字,大约阅读时间需要 7 分钟。

一、apply与call的区别

相同点:“可以让一个对象调用另一个对象的方法”

不同点:

  • apply最多只能传入两个参数,第一个为对象,第二个为数组
  • call能传入多个参数,第一个为对象,其后为n个参数列表

实际上,apply和call实现的功能是一样的,只是传入的参数不同而已。

示例:

function add(a,b){  return a+b;  }function sub(a,b){  return a-b;  }var a1 = add.apply(sub,[4,2]);  //sub调用add的方法var a2 = sub.apply(add,[4,2]);alert(a1);  //6     alert(a2);  //2/*call的用法*/var a1 = add.call(sub,4,2);

apply的一些使用技巧

  1. 配合Math.max()计算数组最大值

因为Math.max()不支持数组的方式,只能Math.max(a,b,c....)

根据apply的特点来实现这一功能,Math.max.apply(null,[1,2,3]),因为没有新的对象调用Math的max方法,所以只是传入null来利用apply的特性帮助进行计算而已。

apply会将数组中的每个元素一个个传入给Math.max()。也就相当于Math.max.call(null,1,2,3)

同理可以用Math.min.apply(null,[1,2,3])计算数组最小值

注意:在ES6中就更加简单了,
Math.max.apply(...[1,2,3])
  1. 配合Array.prototype.push实现两个数组合并

数组的push方法是不能push数组的,但是可以同时push多个元素,因此可以利用apply的特性

var a = [1,2,3];var b = [4,5,6];Array.prototype.push.apply(a,b);//apply会将为b中每一个元素执行一次push方法。返回值是push后数组a的长度

同样在ES6中只需要a.push(...b),就可以实现。

参考链接:

二、Object.prototype.toString.call()进行类型检验

首先来看一个问题,用typeof来检验类型有什么缺点呢?

答案是typeof无法准确地检验对象类型。

typeof null //objecttypeof [] //object

比较好的方式就是用 Object.prototype.toString.call()来进行检验。

var a = {};var b = [];var c = 1;Object.prototype.toString.call(a);//[object,Object]Object.prototype.toString.call(b);//[object,Array]Object.prototype.toString.call(c);//[object,Number]//判断a是否是对象类型Object.prototype.toString.call(a) === "[object,Object]"
注意:使用obj.toString()是不能得到类型的。
原因:Array,Function等类型作为Object的实例,都重写的了toString方法。因此在调用时,是调用了重写后的方法,而不是原型链上的toString()方法
var arr=[1,2,3];console.log(Array.prototype.hasOwnProperty("toString"));//trueconsole.log(arr.toString());//1,2,3delete Array.prototype.toString;//delete操作符可以删除实例属性console.log(Array.prototype.hasOwnProperty("toString"));//falseconsole.log(arr.toString());//"[object Array]"

删除了重写的方法后,使用obj.toString()也就相当于调用原型链的方法了,即Object.prototype.toString.call()

参考链接:

三、封装成函数

可以通过以下方式封装成一个函数,语义更加清晰

export function typeOf (param) {  return Object.prototype.toString.call(param).match(/\s+(\w+)/)[1] //正则匹配}

Vue中可以定义成全局函数

//main.jsVue.prototype.typeof = function (param) {  return Object.prototype.toString.call(param).match(/\s+(\w+)/)[1]}// 组件中调用this.typeof([])//Array

转载地址:http://sckpa.baihongyu.com/

你可能感兴趣的文章
Java 之设计模式(总述)
查看>>
第二篇:zc706 基本外设及usb DEVICE模式测试过程
查看>>
数据集划分——train set, validate set and test set
查看>>
《大话设计模式》读书笔记-第7章 代理模式
查看>>
自定义类似@Required功能的注解
查看>>
多项式学习笔记
查看>>
jquery 随笔
查看>>
ElasticSearch集群安装配置
查看>>
区间调度问题
查看>>
Maven学习总结(14)——Maven 多模块项目如何分工?
查看>>
python 参数
查看>>
linux 源码安装详解
查看>>
字符压缩题目
查看>>
frog-jump
查看>>
js实例:验证只能输入数字和一个小数点
查看>>
vue-cli脚手架安装和webpack-simple模板项目生成
查看>>
多媒体杂志
查看>>
python从入门到大神---3、浮光掠影python3语法
查看>>
Java中为什么要使用线程池?如何使用?
查看>>
Openstack Nova 源码分析 — RPC 远程调用过程
查看>>