我总是经常碰到需要检查某个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,派生类的成员函数可带可不带。 这两个成员函数原型(函数名,函数参数,函数返回类型)必须相同。 注意:如果