zoukankan      html  css  js  c++  java
  • 阅读underscore源码笔记

    本文为原创作品,可以转载,但请添加本文连接,谢谢传阅,本人博客已转移至github,地址为:jruif.github.io

    underscorejs,一个实用的的Javascript函数库,值得推荐,官网地址Github仓库有注释的源码

    • obj.length === +obj.length 判断obj.length是不是一个数字,“+”会吧非number类型的值尝试转换为number类型,如果失败返回NAN。
    • void 0 这个相信大家经常见,但是你明白它是做什么的吗?而且我们遇到的情况大多都是在超链接里写着Javascript:(void 0),现在我又遇到了a === void 0,好吧,不买官子了,其实这个是用来防止undefined被重置(关于这一点可以点击这里查看),而void是一个修饰参数的前缀关键字,并且永远返回undefined,因此在超链接里使用void 0就清晰了,返回undefined就阻止了a标签的默认事件。例如:
    void 0
    void (0)
    void "hello"
    void (new Date())
    //都将返回undefined
    

    为什么使用0,我只想说呵呵,谁让0最短小可爱呢。

    • ECMAScript5中的bind,underscore的实现方法
    var nativeBind = FuncProto.bind;
    var Ctor = function(){};
    _.bind = function(func, context) {
      var args, bound;
      if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, Array.prototype.slice.call(arguments, 1));
      if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
      args = Array.prototype.slice.call(arguments, 2);
      bound = function() {
        if (!(this instanceof bound)) return func.apply(context, args.concat(Array.prototype.slice.call(arguments)));
        Ctor.prototype = func.prototype;
        var self = new Ctor;
        Ctor.prototype = null;
        var result = func.apply(self, args.concat(Array.prototype.slice.call(arguments)));
        if (_.isObject(result)) return result;
        return self;
      };
      return bound;
    };
    

      bind很多人不明白为什么在有了call和apply还是要出个bind,看完这段代码大家应该明白了吧,其实就是内存驻留版的apply(更多详情前点击这里)。

    其实这个库结构很简单,但是却实现了很多实用的功能函数,下面在copy一段比较实用函数。

     1 _.isEmpty = function(obj) {
     2   if (obj == null) return true;
     3   if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
     4   for (var key in obj) if (_.has(obj, key)) return false;
     5   return true;
     6 };
     7 _.isElement = function(obj) {
     8   return !!(obj && obj.nodeType === 1);
     9 };
    10 _.isArray = nativeIsArray || function(obj) {
    11   return toString.call(obj) === '[object Array]';
    12 };
    13 _.isObject = function(obj) {
    14   var type = typeof obj;
    15   return type === 'function' || type === 'object' && !!obj;
    16 };
    17 _.isNaN = function(obj) {
    18   return _.isNumber(obj) && obj !== +obj;
    19 };
    20 _.isBoolean = function(obj) {
    21   return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
    22 };
    23 _.has = function(obj, key) {
    24   return obj != null && hasOwnProperty.call(obj, key);
    25 };

    欢迎加入Javascript前端技术,群号为:85088298

  • 相关阅读:
    复杂对象类型的WebService高级部分
    linux 免输入密码脚本
    查看端口是否被占用
    shell将脚本输出结果记录到日志文件
    多线程注意点
    apache Tomcat配置SSL(https)步骤
    常用的web安全处理
    SQL 中的 UNION 和UNION ALL 的区别
    数据库和数据仓库区别
    Oracle数据库创建表是有两个约束带有默认索引
  • 原文地址:https://www.cnblogs.com/wolm/p/3988827.html
Copyright © 2011-2022 走看看