摘要:會(huì)將數(shù)組中的每個(gè)元素一個(gè)個(gè)傳入給。參考鏈接與的區(qū)別二進(jìn)行類(lèi)型檢驗(yàn)首先來(lái)看一個(gè)問(wèn)題,用來(lái)檢驗(yàn)類(lèi)型有什么缺點(diǎn)呢答案是無(wú)法準(zhǔn)確地檢驗(yàn)對(duì)象類(lèi)型。比較好的方式就是用來(lái)進(jìn)行檢驗(yàn)。判斷是否是對(duì)象類(lèi)型注意使用是不能得到類(lèi)型的。
一、apply與call的區(qū)別
相同點(diǎn):“可以讓一個(gè)對(duì)象調(diào)用另一個(gè)對(duì)象的方法”
不同點(diǎn):
apply最多只能傳入兩個(gè)參數(shù),第一個(gè)為對(duì)象,第二個(gè)為數(shù)組
call能傳入多個(gè)參數(shù),第一個(gè)為對(duì)象,其后為n個(gè)參數(shù)列表
實(shí)際上,apply和call實(shí)現(xiàn)的功能是一樣的,只是傳入的參數(shù)不同而已。
示例:
function add(a,b){ return a+b; } function sub(a,b){ return a-b; } var a1 = add.apply(sub,[4,2]); //sub調(diào)用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()計(jì)算數(shù)組最大值
因?yàn)?b>Math.max()不支持?jǐn)?shù)組的方式,只能Math.max(a,b,c....)。
根據(jù)apply的特點(diǎn)來(lái)實(shí)現(xiàn)這一功能,Math.max.apply(null,[1,2,3]),因?yàn)闆](méi)有新的對(duì)象調(diào)用Math的max方法,所以只是傳入null來(lái)利用apply的特性幫助進(jìn)行計(jì)算而已。
apply會(huì)將數(shù)組中的每個(gè)元素一個(gè)個(gè)傳入給Math.max()。也就相當(dāng)于Math.max.call(null,1,2,3)
同理可以用Math.min.apply(null,[1,2,3])計(jì)算數(shù)組最小值
注意:在ES6中就更加簡(jiǎn)單了,Math.max.apply(...[1,2,3])
配合Array.prototype.push實(shí)現(xiàn)兩個(gè)數(shù)組合并
數(shù)組的push方法是不能push數(shù)組的,但是可以同時(shí)push多個(gè)元素,因此可以利用apply的特性
var a = [1,2,3]; var b = [4,5,6]; Array.prototype.push.apply(a,b);//apply會(huì)將為b中每一個(gè)元素執(zhí)行一次push方法。返回值是push后數(shù)組a的長(zhǎng)度
同樣在ES6中只需要a.push(...b),就可以實(shí)現(xiàn)。
參考鏈接:二、Object.prototype.toString.call()進(jìn)行類(lèi)型檢驗(yàn)
apply()與call()的區(qū)別
首先來(lái)看一個(gè)問(wèn)題,用typeof來(lái)檢驗(yàn)類(lèi)型有什么缺點(diǎn)呢?
答案是typeof無(wú)法準(zhǔn)確地檢驗(yàn)對(duì)象類(lèi)型。
typeof null //object typeof [] //object
比較好的方式就是用 Object.prototype.toString.call()來(lái)進(jìn)行檢驗(yàn)。
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是否是對(duì)象類(lèi)型 Object.prototype.toString.call(a) === "[object,Object]"
注意:使用obj.toString()是不能得到類(lèi)型的。
原因:Array,Function等類(lèi)型作為Object的實(shí)例,都重寫(xiě)的了toString方法。因此在調(diào)用時(shí),是調(diào)用了重寫(xiě)后的方法,而不是原型鏈上的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操作符可以刪除實(shí)例屬性 console.log(Array.prototype.hasOwnProperty("toString"));//false console.log(arr.toString());//"[object Array]"
刪除了重寫(xiě)的方法后,使用obj.toString()也就相當(dāng)于調(diào)用原型鏈的方法了,即Object.prototype.toString.call()
三、封裝成函數(shù)參考鏈接:
為什么用Object.prototype.toString.call(obj)檢測(cè)對(duì)象類(lèi)型?
深入理解Object.prototype.toString.call()
原文地址
可以通過(guò)以下方式封裝成一個(gè)函數(shù),語(yǔ)義更加清晰
export function typeOf (param) { return Object.prototype.toString.call(param).match(/s+(w+)/)[1] //正則匹配 }
Vue中可以定義成全局函數(shù)
//main.js Vue.prototype.typeof = function (param) { return Object.prototype.toString.call(param).match(/s+(w+)/)[1] } // 組件中調(diào)用 this.typeof([])//Array
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/108226.html
摘要:如果此方法在自定義對(duì)象中未被覆蓋,返回,其中是對(duì)象的類(lèi)型那為什么會(huì)報(bào)錯(cuò)呢這是為什么呢,因?yàn)闉闃?gòu)造函數(shù),構(gòu)造函數(shù)本身沒(méi)有方法。依照原型鏈關(guān)系,構(gòu)造函數(shù)的上游原型鏈?zhǔn)恰K?,你調(diào)用本質(zhì)上是調(diào)用,這里需要的參數(shù)類(lèi)型是函數(shù),所以會(huì)報(bào)錯(cuò)。 我們知道判斷數(shù)據(jù)類(lèi)型可以用typeof 定義一些數(shù)據(jù) let num=1,str=str,bool=true,obj={},arr=[],sy=Symbol(...
摘要:值的比較只進(jìn)行值的比較會(huì)進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。只要在當(dāng)前實(shí)例的原型鏈上,我們用其檢測(cè)出來(lái)的結(jié)果都是。但檢測(cè)與不一樣,還可以處理基本數(shù)據(jù)類(lèi)型的檢測(cè)。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類(lèi)型的值? Javascript有兩種數(shù)據(jù)類(lèi)型,分別是基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型。其中...
摘要:值的比較只進(jìn)行值的比較會(huì)進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。只要在當(dāng)前實(shí)例的原型鏈上,我們用其檢測(cè)出來(lái)的結(jié)果都是。但檢測(cè)與不一樣,還可以處理基本數(shù)據(jù)類(lèi)型的檢測(cè)。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類(lèi)型的值? Javascript有兩種數(shù)據(jù)類(lèi)型,分別是基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型。其中...
摘要:值的比較只進(jìn)行值的比較會(huì)進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。只要在當(dāng)前實(shí)例的原型鏈上,我們用其檢測(cè)出來(lái)的結(jié)果都是。但檢測(cè)與不一樣,還可以處理基本數(shù)據(jù)類(lèi)型的檢測(cè)。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類(lèi)型的值? Javascript有兩種數(shù)據(jù)類(lèi)型,分別是基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型。其中...
閱讀 2115·2021-11-23 10:06
閱讀 3478·2021-11-11 16:54
閱讀 3346·2019-08-29 17:31
閱讀 3570·2019-08-29 17:05
閱讀 2172·2019-08-26 13:36
閱讀 2161·2019-08-26 12:17
閱讀 528·2019-08-26 12:12
閱讀 1674·2019-08-26 10:19