JavaScript中判断原生函数的两个示例-阿里云开发者社区

开发者社区> 铁锚> 正文

JavaScript中判断原生函数的两个示例

简介: 原文链接: Detect if a Function is Native Code with JavaScript原文日期: 2014-08-17翻译日期: 2014-08-20翻译人员: 铁锚我总是经常碰到需要检查某个function是否是原生代码的情况  —— 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的。
+关注继续查看
原文链接: Detect if a Function is Native Code with JavaScript
原文日期: 2014-08-17
翻译日期: 2014-08-20
翻译人员: 铁锚

我总是经常碰到需要检查某个function是否是原生代码的情况  —— 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的。要检测这一点,最简单的办法当然是判断函数的 toString 方法返回的值啦。

JavaScript代码

判断函数是否是原生方法其实相当简单:
// 判断是否原生函数
function isNative(fn) {
    // 示例:
    // alert.toString()
    // "function alert() { [native code] }"
    // '' + fn 利用了js的隐式类型转换.
    return (/\{\s*\[native code\]\s*\}/).test('' + fn);
}

将函数转换为字符串表示的形式,并且执行正则匹配,这就是实现的原理。

升级版,Update!

Lodash 的作者 John-David Dalton 分享了 一个更好的处理方法:
;(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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java8的函数式接口你真的了解吗?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 函数式接口 如果你的好奇心使你翻看Runnable接口源代码,你会发现该接口被一个@FunctionalInterface的注解修饰,这是 Java 8 中添加的新注解,用于表示 「函数式接口」。
1061 0
【JavaScript框架封装】在实现一个自己定义类似于JQuery的append()函数的时候遇到的问题及解决方案
版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81087543 主要问题: 在刚开始创建了这个函数之后,使用的时候,总是会出现一个问题,就是按照正常步骤给一个ID选择器添加子节点的时候正常,但是到了给一个class选择器的元素添加的时候始终只能添加一个。
831 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4477 0
开发函数计算的正确姿势 —— Fun validate 语法校验排错指南
1. 前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。
2237 0
javascript 表达式、括号、常用函数和jquery库怎么样实现的分析
(一)javascript表达式 表达式是什么?表达式是对变更进行赋值、更改或计算等操作的语句。它是变量、常量、操作符的综合。根据操作符的不类型,可以分为字符操作表达式、赋值表达式、逻辑表达式、关系表达式、自增自减表达式、位表达式等。
719 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3227 0
一文带你了解JavaScript函数式编程
摘要: 函数式编程入门。 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有。 前言 函数式编程在前端已经成为了一个非常热门的话题。在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想。
954 0
+关注
铁锚
Java与数据库开发
179
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载