一、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的一些使用技巧
- 配合
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])
- 配合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)
,就可以实现。
参考链接:
apply()与call()的区别
二、Object.prototype.toString.call()进行类型检验
首先来看一个问题,用typeof来检验类型有什么缺点呢?
答案是typeof无法准确地检验对象类型。
typeof null //object
typeof [] //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"));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));//false
console.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.js
Vue.prototype.typeof = function (param) {
return Object.prototype.toString.call(param).match(/\s+(\w+)/)[1]
}
// 组件中调用
this.typeof([])//Array
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。