4

在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

4

2 回答 2

4

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

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

另请参阅下划线的来源

  // Create quick reference variables for speed access to core prototypes.
  var slice            = ArrayProto.slice,
      unshift          = ArrayProto.unshift,
      toString         = ObjProto.toString,
      hasOwnProperty   = ObjProto.hasOwnProperty;
于 2012-07-31T15:39:47.357 回答
0

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

来自下划线的源代码

  // 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;
于 2012-07-31T15:40:17.037 回答