Underscore 源码 - 类型判断

看了看 Underscore 1.8.3 源码类型判断这一部分,觉得挺有用的,做以记录。

通用类型判断

基本方法都是通过对象的 toString 方法将其转换为特定字符串 [object ' + name + '],再加以判断。

  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });

是否有限数

Js 内部有 isFinite 方法,但是判断 null 为 Ture 值。加上 !isNaN(parseFloat(obj)) 便可剔除 null 值。

  // Is a given object a finite number?
  _.isFinite = function(obj) {
    return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj));
  };

是否布尔值

布尔值的官方定义为『值为 true 或 false 的值的集合』。那么为什么还要判定 toString.call(obj) === '[object Boolean]' 呢?是因为 new Boolean() 为一个布尔对象,这里将它也看成是布尔值。

  _.isBoolean = function(obj) {
    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
  };

是否为空值 null

null 值就是 null 也不可被改变,用强相等 === 就可以了。

  // Is a given value equal to null?
  _.isNull = function(obj) {
    return obj === null;
  };

是否为未定义值 undefined

我们知道,undefined 值是可以被改写的,这也是为什么 jQuery 之类的库会将 undefined 作为参数之一传入整个 IIFE 函数体。

  _.isUndefined = function(obj) {
    return obj === void 0;
  };

void 关键字特别有意思,虽然无论怎样都返回 undefined 但它后面的语句必须执行一次。举个例子:

let a = 1

void(a = 2)  
// undefined

a  
// 2

这是 ECMA 标准规定的 void 语句执行流程。还特别提醒了 GetValue must be called even though its value is not used because it may have observable side-effects.

  1. Let expr be the result of evaluating UnaryExpression.
  2. Perform ? GetValue(expr).
  3. Return undefined.

是否数组

使用了 ES5 的 Array.isArray 方法。

  var nativeIsArray = Array.isArray;

  _.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
  };

是否对象

合并了 function 和 object 两种类型。

  _.isObject = function(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  };

是否 DOM 元素

DOM 元素的 nodeType 值为 1。

  _.isElement = function(obj) {
    return !!(obj && obj.nodeType === 1);
  };
$0.nodeType
// 1

$0.nodeName
// html

你可能会问,$0 是什么鬼?官方的解释在这里。


The $0, $1, $2, $3 and $4 commands work as a historical reference to the last five DOM elements inspected within the Elements panel or the last five JavaScript heap objects selected in the Profiles panel. $0 returns the most recently selected element or JavaScript object, $1 returns the second most recently selected one, and so on.


$0 其实就是你在控制台选取的当前节点,$1 为选取的上一个节点,$2 为上上个节点,以此类推,直到 $4。会像栈一样堆放最近 5 个你在控制台选取的元素。