JavaScript檢查某個function是否是原生程式碼的方法_javascript技巧
我总是经常碰到需要检查某个function是否是原生代码的情况 —— 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的。要检测这一点,最简单的办法当然是判断函数的 toString 方法返回的值啦。
JavaScript代码
判断函数是否是原生方法其实相当简单:
// 判断是否原生函数 function isNative(fn) { // 示例: // alert.toString() // "function alert() { [native code] }" // '' + fn 利用了js的隐式类型转换. return (/\{\s*\[native code\]\s*\}/).test('' + fn); }
将函数转换为字符串表示的形式,并且执行正则匹配,这就是实现的原理。
升级版,Update!
;(function() { // 取得Object的toString方法,用于处理传入参数value的内部(internal) `[[Class]]` var toString = Object.prototype.toString; // 取得原始的Function的toString方法,用于处理functions的反编译代码 var fnToString = Function.prototype.toString; // 用于检测 宿主对象构造器(host constructors), // (Safari > 4; 真的输出特定的数组,really typed array specific) var reHostCtor = /^\[object .+?Constructor\]$/; // 使用RegExp将常用的native方法编译为正则模板. // 使用 `Object#toString` 是因为一般他不会被污染 var reNative = RegExp('^' + // 将 `Object#toString` 强转为字符串 String(toString) // 对所有正则表达式相关的特殊字符进行转义 .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&') // 为了保持模板的通用性,将 `toString` 替换为 `.*?` // 将`for ...`之类的字符替换,兼容Rhino等环境,因为他们会有额外的信息,如方法的参数数量. .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') // 结束符 + '$' ); function isNative(value) { // 判断 typeof var type = typeof value; return type == 'function' // 使用 `Function#toString`原生方法来调用, // 而不是 value 自己的 `toString` 方法, // 以免被伪造所欺骗. ? reNative.test(fnToString.call(value)) // 如果type 不是'function', // 则需要检查宿主对象(host object)的情形, // 因为某些(浏览器)环境会将 typed arrays 之类的东西当作DOM方法 // 此时可能不匹配标准的Native正则模式 : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false; }; // 可以将 isNative 赋值给你想要的变量/对象 window.isNative = isNative; }());
isNative(isNative) //false isNative(alert) //true window.isNative(window.isNative) //false window.isNative(window.alert) //true window.isNative(String.toString) //true

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

function是函數的意思,是一段具有特定功能的可重複使用的程式碼區塊,是程式的基本組成單元之一,可以接受輸入參數,執行特定的操作,並傳回結果,其目的是封裝一段可重複使用的程式碼,提高程式碼的可重複使用性和可維護性。

在本文中,我們將了解enumerate()函數以及Python中「enumerate()」函數的用途。什麼是enumerate()函數? Python的enumerate()函數接受資料集合作為參數並傳回一個枚舉物件。枚舉物件以鍵值對的形式傳回。 key是每個item對應的索引,value是items。語法enumerate(iterable,start)參數iterable-傳入的資料集合可以作為枚舉物件傳回,稱為iterablestart-顧名思義,枚舉物件的起始索引由start定義。如果我們忽

MySQL.proc表的功能與功能詳解MySQL是一種流行的關係型資料庫管理系統,開發者在使用MySQL時常常會涉及到預存程序(StoredProcedure)的建立與管理。而MySQL.proc表則是一個非常重要的系統表,它儲存了資料庫中所有的預存程序的相關信息,包括預存程序的名稱、定義、參數等。在本文中,我們將詳細解釋MySQL.proc表的作用與功能

Vue.use函數的用法和作用Vue是一款流行的前端框架,它提供了許多有用的功能和功能。其中之一就是Vue.use函數,它可以讓我們在Vue應用中使用插件。本文將介紹Vue.use函數的用法和作用,並且提供一些程式碼範例。 Vue.use函數的基本用法非常簡單,只需在Vue實例化之前呼叫它,並傳入要使用的插件作為參數。以下是一個簡單的範例://引入並使用插件

clearstatcache()函數用於清除檔案狀態快取。 PHP快取以下函數傳回的資訊−stat()lstat()file_exists()is_writable()is_readable()is_executable()is_file()is_dir()filegroup()fileowner()filesize()filetype()fileperms()這樣做是為了提供更好的性能。語法voidclearstatecache()參數NA傳回值clearstatcache(

file_exists方法檢查檔案或目錄是否存在。它接受要檢查的檔案或目錄的路徑作為參數。以下是它的用途-當您需要在處理之前知道文件是否存在時,它非常有用。這樣,在建立新檔案時使用此函數即可知道該檔案是否已存在。語法file_exists($file_path)參數file_path-設定要檢查是否存在的檔案或目錄的路徑。必需。返回file_exists()方法返回。如果檔案或目錄存在,則傳回TrueFalse,如果檔案或目錄不存在範例讓我們看一個檢查「candidate.txt」檔案和即使文件

隨著網際網路的發展,SOA(服務導向的架構)成為了當今企業級系統中的重要的技術架構。 SOA架構中的服務可以重複使用、重組和擴展,同時也能夠簡化系統開發和維護的過程。 PHP作為一種被廣泛使用的Web程式語言,也提供了一些實作SOA的函數函式庫。接下來,我們將詳細介紹如何在PHP中使用SOA函數。一、SOA的基本概念SOA是分散式系統開發的思想與架構

js函數function用法有:1、宣告函數;2、呼叫函數;3、函數參數;4、函數回傳值;5、匿名函數;6、函數為參數;7、函數作用域;8、遞歸函數。
