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

原文链接: 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

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

时间: 2024-10-06 18:19:34

JavaScript中判断原生函数的两个示例的相关文章

理解与使用Javascript中的回调函数 -2

在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply()函数的,或者有一些简短的关于callback的使用示例. 函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用 Function()构造函数创建的Function对象.Function对象包含一个字符串,字符串

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type

理解和使用 JavaScript 中的回调函数

原文:http://javascriptissexy.com/ 在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟到函数中执行,甚至执行后

理解javascript中的回调函数(callback)【转】

在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟到函数中执行,甚至执行后将它返回.这是在JavaScript中使用回调函数的精髓.本篇文

在JavaScript中判断整型的N种方法

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

Javascript 中的回调函数和递归函数简单实际分析学习

Javascript 中的回调函数和递归函数简单实际分析学习 1 回调函数 所谓回调函数简单理解就是将一个函数做为参数传递给其他的函数供其使用.(只是在js中,因为其它的语言中有指针这个概念). 举一个简单的例子,当我们在统计账单的时候就要整理材料这些,然后就需要计算器,计算器我们想象成为一个可以实现计算的函数.统计账单是另外的另一个函数,当统计账单的时候就会需要计算器这个函数的支持,其实这就是一个简单的回调.可以按这个理解. 下来我借用网上的一个例子: //先定义一个函数fun1 functi

JavaScript中判断变量类型最简洁的实现方法(#################################)

这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了typeof运算符,因此最容易想到的是用typeof来判断是否是number类型. 复制代码代码如下: 1 2 3 function isNumber(obj) {     return typeof obj === 'number' } 这个函数对于整数和浮点数都没有问题,但对于NaN值也返回true这让

JavaScript中判断为整数的多种方式

原文:JavaScript中判断为整数的多种方式 之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer). JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示.但实际操作中比如数组索引.位操作则是基于32位整数. 方式一.使用取余运算符判断 任何整数都会被1整除,即余数是0.利用这个规则来判断是否是整数. function isInteger(obj) { return obj%1 === 0 } isInteger(3

JavaScript中的匿名函数及函数的闭包以及作用域

1. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85