JavaScript中判斷原生函數(shù)檢查function是否是原生代碼
我總是經(jīng)常碰到需要檢查某個(gè)function是否是原生代碼的情況 —— 這是功能測試中一個(gè)很重要的內(nèi)容: 函數(shù)是瀏覽器內(nèi)置支持的,還是通過第三方類庫模擬的。要檢測這一點(diǎn),最簡單的辦法當(dāng)然是判斷函數(shù)的 toString 方法返回的值啦。
JavaScript代碼
判斷函數(shù)是否是原生方法其實(shí)相當(dāng)簡單:
// 判斷是否原生函數(shù) function isNative(fn) { // 示例: // alert.toString() // "function alert() { [native code] }" // '' + fn 利用了js的隱式類型轉(zhuǎn)換. return (/\{\s*\[native code\]\s*\}/).test('' + fn); }
將函數(shù)轉(zhuǎn)換為字符串表示的形式,并且執(zhí)行正則匹配,這就是實(shí)現(xiàn)的原理。
升級(jí)版,Update!
;(function() { // 取得Object的toString方法,用于處理傳入?yún)?shù)value的內(nèi)部(internal) `[[Class]]` var toString = Object.prototype.toString; // 取得原始的Function的toString方法,用于處理functions的反編譯代碼 var fnToString = Function.prototype.toString; // 用于檢測 宿主對(duì)象構(gòu)造器(host constructors), // (Safari > 4; 真的輸出特定的數(shù)組,really typed array specific) var reHostCtor = /^\[object .+?Constructor\]$/; // 使用RegExp將常用的native方法編譯為正則模板. // 使用 `Object#toString` 是因?yàn)橐话闼粫?huì)被污染 var reNative = RegExp('^' + // 將 `Object#toString` 強(qiáng)轉(zhuǎn)為字符串 String(toString) // 對(duì)所有正則表達(dá)式相關(guān)的特殊字符進(jìn)行轉(zhuǎn)義 .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&') // 為了保持模板的通用性,將 `toString` 替換為 `.*?` // 將`for ...`之類的字符替換,兼容Rhino等環(huán)境,因?yàn)樗麄儠?huì)有額外的信息,如方法的參數(shù)數(shù)量. .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') // 結(jié)束符 + '$' ); function isNative(value) { // 判斷 typeof var type = typeof value; return type == 'function' // 使用 `Function#toString`原生方法來調(diào)用, // 而不是 value 自己的 `toString` 方法, // 以免被偽造所欺騙. ? reNative.test(fnToString.call(value)) // 如果type 不是'function', // 則需要檢查宿主對(duì)象(host object)的情形, // 因?yàn)槟承?瀏覽器)環(huán)境會(huì)將 typed arrays 之類的東西當(dāng)作DOM方法 // 此時(shí)可能不匹配標(biāo)準(zhǔn)的Native正則模式 : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false; }; // 可以將 isNative 賦值給你想要的變量/對(duì)象 window.isNative = isNative; }());
測試代碼:
isNative(isNative) //false isNative(alert) //true window.isNative(window.isNative) //false window.isNative(window.alert) //true window.isNative(String.toString) //true
- 淺談JavaScript函數(shù)的四種存在形態(tài)
- JavaScript中判斷函數(shù)、變量是否存在
- javascript版的in_array函數(shù)(判斷數(shù)組中是否存在特定值)
- js 判斷js函數(shù)、變量是否存在的簡單示例代碼
- Javascript 判斷是否存在函數(shù)的方法
- JavaScript基于自定義函數(shù)判斷變量類型的實(shí)現(xiàn)方法
- JS自定義函數(shù)對(duì)web前端上傳的文件進(jìn)行類型大小判斷
- 判斷數(shù)組是否包含某個(gè)元素的js函數(shù)實(shí)現(xiàn)方法
- JavaScript判斷頁面加載完之后再執(zhí)行預(yù)定函數(shù)的技巧
- javascript判斷css3動(dòng)畫結(jié)束 css3動(dòng)畫結(jié)束的回調(diào)函數(shù)
- JavaScript中判斷變量是數(shù)組、函數(shù)或是對(duì)象類型的方法
- JavaScript判斷變量是否為空的自定義函數(shù)分享
- JS簡單判斷函數(shù)是否存在的方法
相關(guān)文章
TensorFlow.js機(jī)器學(xué)習(xí)預(yù)測鳶尾花種類
TensorFlow.js是一個(gè)開源的基于硬件加速的JavaScript庫,用于訓(xùn)練和部署機(jī)器學(xué)習(xí)模型。本教程將會(huì)帶大家簡單了解和使用TensorFlow.js框架實(shí)現(xiàn)預(yù)測鳶尾花種類2022-11-11javascript自啟動(dòng)函數(shù)的問題探討
自啟動(dòng)函數(shù)想必大家并不陌生吧,在本文將為大家詳細(xì)探討下,感興趣的朋友可不要錯(cuò)過2013-10-10詳解JavaScript中if語句優(yōu)化和部分語法糖小技巧推薦
在前端日常開發(fā)過程中,if?else判斷語句使用的次數(shù)應(yīng)該是比較頻繁的了,一些較為復(fù)雜的場景,可能會(huì)用到很多判斷,本文給大家介紹JavaScript中if語句優(yōu)化和部分語法糖小技巧,感興趣的朋友一起看看吧2022-05-05SpringMVC+bootstrap table實(shí)例詳解
本文通過實(shí)例給大家介紹了SpringMVC+bootstrap-table,需要的朋友可以參考下2017-06-06js彈出層包含flash 不能關(guān)閉隱藏的2種處理方法
js彈出層包含flash 不能關(guān)閉隱藏的2種處理方法,需要的朋友可以參考一下2013-06-06