当前位置: 首页 > 编程笔记 >

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

堵存
2023-03-14
本文向大家介绍JavaScript中判断原生函数检查function是否是原生代码,包括了JavaScript中判断原生函数检查function是否是原生代码的使用技巧和注意事项,需要的朋友参考一下

我总是经常碰到需要检查某个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
 类似资料:
  • 返回一个布尔值,确定专递的值是否为原始值。 在不是原始类型的字符串数组上使用 Array.includes() , 使用 typeof 提供类型。 由于 typeof null 被求值为 'object',所以需要直接比较。 const isPrimitive = val => !['object', 'function'].includes(typeof val) || val === null

  • 如何判断一个function是否是函数式组件? 我们有如下的函数式组件代码: 但是当我运行的时候报错: 这里说Hooks can only be called inside of the body of a function component. 但是我这个就是一个函数式组件呀,请问如何进行判断是否是函数式组件呢? 注: 我的文件路径在: 代码就是如上。没有看到有写错的地方呢,如何能判断我写的这个

  • 本文向大家介绍基于原生js实现判断元素是否有指定class名,包括了基于原生js实现判断元素是否有指定class名的使用技巧和注意事项,需要的朋友参考一下 【注意】以下方法只对class只有一个值的情况下操作 结构部分: js部分: 以上三种可以任选,条件是不考虑兼容性和多个class名的情况 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 主要内容:什么是云原生,云原生的4大组件,如何云原生什么是云原生 技术的变革,一定是思想先行,云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生(CloudNative)是一个组合词,Cloud+Native。Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性+分布式优势。Pivotal公司的Matt Stine

  • 问题内容: 我的代码是 但是,有时我无法加载。萤火虫错误 me.onChange不是一个函数 我想优雅地降级,因为这不是我程序中最重要的功能。给出相同的错误。 关于如何确保它存在然后仅执行的任何建议? (下面的任何一种方法都不能尝试抓到一件作品) 问题答案: 尝试这样的事情: 或更好(根据UpTheCreek推荐的评论)

  • 本文向大家介绍C++中判断成员函数是否重写,包括了C++中判断成员函数是否重写的使用技巧和注意事项,需要的朋友参考一下 C++中判断成员函数是否重写 判断一个成员函数是不是虚函数(重写),有两个三个条件: 两个成员函数各自在基类和派生类中定义; 基类中定义的成员函数必须带有关键字virtual,派生类的成员函数可带可不带。 这两个成员函数原型(函数名,函数参数,函数返回类型)必须相同。 注意:如果