国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

JackJiang / 519人閱讀

摘要:會將數組中的每個元素一個個傳入給。參考鏈接與的區別二進行類型檢驗首先來看一個問題,用來檢驗類型有什么缺點呢答案是無法準確地檢驗對象類型。比較好的方式就是用來進行檢驗。判斷是否是對象類型注意使用是不能得到類型的。

一、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()

參考鏈接:

為什么用Object.prototype.toString.call(obj)檢測對象類型?

深入理解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://specialneedsforspecialkids.com/yun/108226.html

相關文章

  • JS數據類型檢驗

    摘要:如果此方法在自定義對象中未被覆蓋,返回,其中是對象的類型那為什么會報錯呢這是為什么呢,因為為構造函數,構造函數本身沒有方法。依照原型鏈關系,構造函數的上游原型鏈是。所以,你調用本質上是調用,這里需要的參數類型是函數,所以會報錯。 我們知道判斷數據類型可以用typeof 定義一些數據 let num=1,str=str,bool=true,obj={},arr=[],sy=Symbol(...

    wuyumin 評論0 收藏0
  • JavaScript的數據類型及其檢測

    摘要:值的比較只進行值的比較會進行數據類型的轉換。只要在當前實例的原型鏈上,我們用其檢測出來的結果都是。但檢測與不一樣,還可以處理基本數據類型的檢測。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類型的值? Javascript有兩種數據類型,分別是基本數據類型和引用數據類型。其中...

    starsfun 評論0 收藏0
  • JavaScript的數據類型及其檢測

    摘要:值的比較只進行值的比較會進行數據類型的轉換。只要在當前實例的原型鏈上,我們用其檢測出來的結果都是。但檢測與不一樣,還可以處理基本數據類型的檢測。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類型的值? Javascript有兩種數據類型,分別是基本數據類型和引用數據類型。其中...

    dingding199389 評論0 收藏0
  • JavaScript的數據類型及其檢測

    摘要:值的比較只進行值的比較會進行數據類型的轉換。只要在當前實例的原型鏈上,我們用其檢測出來的結果都是。但檢測與不一樣,還可以處理基本數據類型的檢測。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類型的值? Javascript有兩種數據類型,分別是基本數據類型和引用數據類型。其中...

    Moxmi 評論0 收藏0

發表評論

0條評論

JackJiang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<