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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索javascript
原生函数
原生javascript、javascript 原生ajax、javascript原生代码、原生javascript插件、原生javascript做动画,以便于您获取更多的相关知识。

时间: 2024-11-01 03:48:17

JavaScript中判断原生函数检查function是否是原生代码_javascript技巧的相关文章

JavaScript中判断页面关闭、页面刷新的实现代码_javascript技巧

今天由于项目需要判断用户离开页面时要判断用户的行为是关闭还是刷新 虽然没有直接的方法,但通过一定的技巧也能做到 不得不感叹JavaScript的强大!! 请看一下代码: 复制代码 代码如下: window.onunload = function(){               var a_n = window.event.screenX - window.screenLeft;               var a_b = a_n > document.documentElement.scr

JavaScript中实现无缝滚动、分享到侧边栏实例代码_javascript技巧

废话不多说,直接给大家贴代码了,代码解决一起问题! 下面一段代码给大家介绍js无缝滚动实例代码: 代码如下所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&

JavaScript中判断原生函数检查function是否是原生代码

  我总是经常碰到需要检查某个function是否是原生代码的情况 -- 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的.要检测这一点,最简单的办法当然是判断函数的 toString 方法返回的值啦. JavaScript代码 判断函数是否是原生方法其实相当简单: 1// 判断是否原生函数 2function isNative(fn) { 3// 示例: 4// alert.toString() 5// "function alert() { [native

在JavaScript中判断整型的N种方法示例介绍_javascript技巧

整数类型(Integer)在JavaScript经常会导致一些奇怪的问题.在ECMAScript的规范中,他们只存在于概念中: 所有的数字都是浮点数,并且整数只是没有一组没有小数的数字. 在这篇博客中,我会解释如何去检查某个值是否为整型. ECMAScript 5 在ES5中有很多方法你可以使用.有时侯,你可能想用自己的方法:一个isInteger(x)的函数,如果是整型返回true,否则返回false. 让我们看看一些例子. 通过余数检查 你可以使用余数运算(%),将一个数字按1求余,看看余数

Javascript中判断变量是数组还是对象(array还是object)_javascript技巧

怎样判断一个JavaScript变量是array还是obiect? 答案: 1.如果你只是用typeof来检查该变量,不论是array还是object,都将返回'objec'. 此问题的一个可行的答案是是检查该变量是不是object,并且检查该变量是否有数字长度(当为空array时长度也可能为0). 然而,参数对象[arguments object](传给制定函数的所有参数),也可能会适用于上述方法,技术上来说,参数对象并不是一个array. 此外,当一个对象有a.length属性的时候,这个方

JavaScript中判断整字类型最简洁的实现方法_javascript技巧

我们知道JavaScript提供了typeof运算符,因此最容易想到的是用typeof来判断是否是number类型. 复制代码 代码如下: function isNumber(obj) {     return typeof obj === 'number' } 这个函数对于整数和浮点数都没有问题,但对于NaN值也返回true这让人感到不爽,毕竟用isNumber判断通过后谁也不会用NaN去做算术运算. 那改进一下,用Object.prototype.toString试试. 复制代码 代码如下:

javascript中的变量是传值还是传址的?_javascript技巧

这个标题念起来有点拗口,但却是理解数据结构的关键.标题中的4个术语,对应的英文分别是:shallow copy(注意,不是shadow copy).deep copy.pass by value.pass by reference(或pass by address).传址和传引用是一回事. 一门编程语言的核心是数据结构,粗略来讲,可以把数据结构分成不可变类型(immutable)和可变类型(mutable).为什么这么分呢?这涉及到内存分配问题.对于不可变类型,只要分配有限的内存空间即可,而对于

javaScript中定义类或对象的五种方式总结_javascript技巧

第一种方式: 工厂方法 能创建并返回特定类型的对象的工厂函数(factory function). function createCar(sColor){ var oTempCar = new Object; oTempCar.color = sColor; oTempCar.showColor = function (){ alert(this.color); }; return oTempCar; } var oCar1 = createCar(); var oCar2 = createCa

javascript中使用new与不使用实例化对象的区别_javascript技巧

我们先来看个实例 function Me(name,age,job){ this.name = name; this.age = age; this.job = job; } 请问这以下两种实例化对象方式有什么区别呢? var mefun1 = new Me('fei','20','it'); var mefun2 = Me('fei','20','it'); 简单的说 第一种是构造函数式,即通过new运算符调用构造函数Function来创建函数 第二种不是实例化,只是调用函数把返回值赋给变量.