.isNumber如何在underscore.js中工作?

时间:2012-07-31 15:32:54

标签: javascript underscore.js

在underscore.js中,以下代码似乎添加了_.isNumber()

  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) == '[object ' + name + ']';
    };
  });

但是必须有其他事情发生,因为将此代码直接复制到firefox会导致它失败,因为toString.call(5)返回[xpconnect wrapped native prototype] - 所以它显然在其他地方做了其他事情 - 但我不能弄清楚是什么。

以下是firefox中的结果示例:

http://jsbin.com/uviyaz/2/edit

2 个答案:

答案 0 :(得分:4)

您的jsbin正在显示window.toString,其中下划线正在使用Object.prototype.toString,他们在代码中将其别名为toString

请参阅http://jsbin.com/uviyaz/3/edit

另见underscore's source他们在哪里:

  // Create quick reference variables for speed access to core prototypes.
  var slice            = ArrayProto.slice,
      unshift          = ArrayProto.unshift,
      toString         = ObjProto.toString,
      hasOwnProperty   = ObjProto.hasOwnProperty;

答案 1 :(得分:0)

在下划线的代码中,toString是一个局部变量,其值为Object.prototype.toString。你认为它是一个全局函数 - 这就是你得到意想不到的结果的原因。

来自underscore's source code

  // Save bytes in the minified (but not gzipped) version:
  var ArrayProto = Array.prototype,
      ObjProto = Object.prototype,
      FuncProto = Function.prototype;

  // Create quick reference variables for speed access to core prototypes.
  var push = ArrayProto.push,
      slice = ArrayProto.slice,
      unshift = ArrayProto.unshift,
      toString = ObjProto.toString,
      hasOwnProperty = ObjProto.hasOwnProperty;