利用Object.prototype.toString.call()來進行類型檢驗

1、apply與call的區別

相同點:「可讓一個對象調用另外一個對象的方法」
不一樣點:html

  • apply最多隻能傳入兩個參數,第一個爲對象,第二個爲數組
  • call能傳入多個參數,第一個爲對象,其後爲n個參數列表

實際上,apply和call實現的功能是同樣的,只是傳入的參數不一樣而已。數組

示例:app

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)this

同理能夠用Math.min.apply(null,[1,2,3])計算數組最小值.net

注意:在ES6中就更加簡單了, Math.max.apply(...[1,2,3])
  1. 配合Array.prototype.push實現兩個數組合並

數組的push方法是不能push數組的,可是能夠同時push多個元素,所以能夠利用apply的特性prototype

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),就能夠實現。code

參考連接:
apply()與call()的區別

2、Object.prototype.toString.call()進行類型檢驗

首先來看一個問題,用typeof來檢驗類型有什麼缺點呢?htm

答案是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()

參考連接:

原文地址

3、封裝成函數

能夠經過如下方式封裝成一個函數,語義更加清晰

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
相關文章
相關標籤/搜索