zoukankan      html  css  js  c++  java
  • underscore objects

    1、_.keys():获取对象的属性名,不包含原型链

    _.keys = nativeKeys || function(obj) {
        if (obj !== Object(obj)) throw new TypeError('Invalid object');
        var keys = [];
        //都是用自增函数
        for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
        return keys;
      };
    

    2、_.values():返回对象的值,不包含原型链的值

    _.values = function(obj) {
        //对函数执行_.identity,并返回数组
        return _.map(obj, _.identity);
      };
    

    3、_.functions():返回对象所有的方法名

    _.functions = _.methods = function(obj) {
        var names = [];
        for (var key in obj) {
          if (_.isFunction(obj[key])) names.push(key);
        }
        return names.sort();
      };
    

    4、_.extend():复制source对象中的所有属性覆盖到destination对象上,并且返回 destination 对象. 复制是按顺序的

    _.extend = function(obj) {
        //会传入多个source
        each(slice.call(arguments, 1), function(source) {
          for (var prop in source) {
            obj[prop] = source[prop];
          }
        });
        return obj;
      };
    

    5、_.pick():过滤obj,返回指定key的对象

    _.pick = function(obj) {
        var result = {};
        each(_.flatten(slice.call(arguments, 1)), function(key) {
          if (key in obj) result[key] = obj[key];
        });
        return result;
      };
    

    6、_.defaults():用defaults对象填充object中undefined属性。并且返回这个object。

    _.defaults = function(obj) {
        each(slice.call(arguments, 1), function(source) {
          for (var prop in source) {
            if (obj[prop] == null) obj[prop] = source[prop];
          }
        });
        return obj;
      };
    

    7、_.clone():浅复制object,

    _.clone = function(obj) {
        if (!_.isObject(obj)) return obj;
        return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
      };
    

    7、_.tap(object, interceptor):用 object作为参数来调用函数interceptor,然后返回object。链式调用时很有用

    实例
    _.chain([1,2,3,200]) .filter(function(num) { return num % 2 == 0; }) .tap(alert) .map(function(num) { return num * num }) .value();
    _.tap = function(obj, interceptor) {
        interceptor(obj);
        return obj;
      };
    

    8、eq():比较两个数据的值,是否相等

    9、_.isEqual(); 内部函数eq的外部用法

    _.isEqual = function(a, b) {
        return eq(a, b, []);
      };
    

    10、_.isEmpty():测验:'', false, 0, null, undefined, NaN, [], {}

    _.isEmpty = function(obj) {
       //null, undefined if (obj == null) return true;
       //'',[] if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; for (var key in obj) if (_.has(obj, key)) return false;
       //false,0,NaN return true; };

    11、_.isElement():验证对象是否是一个DOM对象 

        _.isElement = function(obj) {
         //为什么要写!! return !!(obj && obj.nodeType == 1); };

    12、_.isArray():验证对象是否是一个数组类型, 优先调用宿主环境提供的isArray方法;isFunction;isString;isNumber,isDate,isRegExp;同样 

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

    13、_.isObject():证对象是否是一个复合数据类型的对象(即非基本数据类型String, Boolean, Number, null, undefined)

    如果基本数据类型通过new进行创建, 则也属于对象类型 

        _.isObject = function(obj) {
            return obj === Object(obj);
        };
    

     14、_.isArguments():检查一个数据是否是一个arguments参数对象

        _.isArguments = function(obj) {
            return toString.call(obj) == '[object Arguments]';
        };
        // 验证isArguments函数, 如果运行环境无法正常验证arguments类型的数据, 则重新定义isArguments方法
    //还可以这样... if(!_.isArguments(arguments)) { // 对于环境无法通过toString验证arguments类型的, 则通过调用arguments独有的callee方法来进行验证 _.isArguments = function(obj) { // callee是arguments的一个属性, 指向对arguments所属函数自身的引用
           //有这个属性,就是arguments return !!(obj && _.has(obj, 'callee')); }; }

    15、_.isFunction():判断是否为函数

    _.isFunction = function(obj) {  
        return toString.call(obj) == '[object Function]';  
    };  
    

    16、_.isString():验证对象是否是一个字符串类型 

    _.isString = function(obj) {  
        return toString.call(obj) == '[object String]';  
    };  
    

    17、_.isNumber():验证对象是否是一个数字类型 

    _.isNumber = function(obj) {  
        return toString.call(obj) == '[object Number]';  
    };  
    

    18_.isFinite(): 检查一个数字是否为有效数字且有效范围(Number类型, 值在负无穷大 - 正无穷大之间)

    _.isFinite = function(obj) {
         //isFinite()是window函数 return _.isNumber(obj) && isFinite(obj); };

    19、_.isNaN(): 检查数据是否为NaN类型(所有数据中只有NaN与NaN不相等)

        _.isNaN = function(obj) {
            return obj !== obj;
        };
    

    20、 _.isBoolean():检查数据是否为Boolean类型

        _.isBoolean = function(obj) {
            // 支持字面量和对象形式的Boolean数据
            return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
        };
    

    21、_.isDate():检查数据是否是一个Date类型 

    _.isDate = function(obj) {  
        return toString.call(obj) == '[object Date]';  
    }; 
    

    22、_.isRegExp():检查数据是否是一个正则表达式类型

    _.isRegExp = function(obj) {  
        return toString.call(obj) == '[object RegExp]';  
    };
    

    23、_.isNull():检查数据是否为null 

     _.isNull = function(obj) {
            return obj === null;
        };
    

    24、_.isUndefined():检查数据是否是Undefined(未定义的)值 

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

    25、_.has():对象本身是否包含指定的属性,不检查原型链,是hasOwnProperty的安全封装

    _.has = function(obj, key) {
       //其实这种不安全,后面的版本会改进 return hasOwnProperty.call(obj, key); };

      

  • 相关阅读:
    编译原理 —— 正规式、正规集和正则定义
    NFA的确定化
    第三章 词法分析与有限自动机
    文法:0型【短语文法】、1型【上下文有关文法】、2型【上下文无关文法】、3型【正规文法】
    语法树、短语、直接短语、句柄、素短语、最左素短语
    【第1章 编译概述】1.2编译程序的发展
    【第1章 编译概述】1.2编译的各个阶段
    【第1章 编译概述】1.1 编译程序功能
    【第1章 编译概述】1.1 程序设计语言
    【第9章 目标代码生成】9.3 简单代码生成器
  • 原文地址:https://www.cnblogs.com/wang-jing/p/4737611.html
Copyright © 2011-2022 走看看