热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新手入门Underscore.js中文(template)

Underscore.js是一个很精干的库,压缩后只有4KB。它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了javaScr

Underscore.js是一个很精干的库,压缩后只有4KB。它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了Javascript的编程。MVC框架Backbone.js就将这个库作为自己的工具库。除了可以在浏览器环境使用,Underscore.js还可以用于Node.js。

Underscor.js定义了一个下划线(_)对象,函数库的所有方法都属于这个对象。这些方法大致上可以分成:集合(collection)、数组(array)、函数(function)、对象(object)和工具(utility)五大类。

集合相关方法

Javascript语言的数据集合,包括两种结构:数组和对象。以下的方法同时适用于这两种结构。

数组处理

数组处理指的是对数组元素进行加工。

map方法对集合的每个成员依次进行某种操作,将返回的值依次存入一个新的数组。

  1. _.map([1, 2, 3], function(num){ return num * 3; });
    // [3, 6, 9]
    _.map({one : 1, two : 2, three : 3}, function(num, key){ return num * 3; }); // [3, 6, 9]

     

each方法与map类似,依次对数组所有元素进行某种操作,不返回任何值。

  1. _.each([1, 2, 3], alert);
    _.each({one : 1, two : 2, three : 3}, alert);

     

reduce方法依次对集合的每个成员进行某种操作,然后将操作结果累计在某一个初始值之上,全部操作结束之后,返回累计的值。该方法接受三个参数。第一个参数是被处理的集合,第二个参数是对每个成员进行操作的函数,第三个参数是累计用的变量。

  1. _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);
    // 6

     

reduce方法的第二个参数是操作函数,它本身又接受两个参数,第一个是累计用的变量,第二个是集合每个成员的值。

shuffle方法返回一个打乱次序的集合。

  1. _.shuffle([1, 2, 3, 4, 5, 6]);
    // [4, 1, 6, 3, 5, 2]

     

数组特征

Underscore.js提供了一系列方法,判断数组元素的特征。这些方法都返回一个布尔值,表示是否满足条件。

every方法判断数组的所有元素是否都满足某个条件。如果都满足则返回true,否则返回false。

  1. _.every([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
    // false

     

some方法则是只要有一个元素满足,就返回true,否则返回false。

  1. _.some([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
    // true

     

size方法返回集合的成员数量。

  1. _.size({one : 1, two : 2, three : 3});
    // 3

     

数组过滤

Underscore.js提供了一系列方法,用于过滤数组,找到符合要求的成员。

filter方法依次对集合的每个成员进行某种操作,只返回操作结果为true的成员。

  1. _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
    // [2, 4, 6]

     

reject方法只返回操作结果为false的成员。

  1. _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
    // [1, 3, 5]

     

find方法依次对集合的每个成员进行某种操作,返回第一个操作结果为true的成员。如果所有成员的操作结果都为false,则返回undefined。

  1. _.find([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
    // 2

     

contains方法表示如果某个值在数组内,则返回true,否则返回false。

  1. _.contains([1, 2, 3], 3);
    // true

     

countBy方法依次对集合的每个成员进行某种操作,将操作结果相同的成员算作一类,最后返回一个对象,表明每种操作结果对应的成员数量。

  1. _.countBy([1, 2, 3, 4, 5], function(num) {
    return num % 2 == 0 ? 'even' : 'odd';
    });
    // {odd: 3, even: 2}

     

对象相关方法

toArray方法将对象转为数组,只包含对象成员的值。典型应用是将对类似数组的对象转为真正的数组。

  1. _.toArray({a:0,b:1,c:2});
    // [0, 1, 2]

     

pluck方法将多个对象的某一个属性的值,提取成一个数组。

  1. var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}];
    _.pluck(stooges, 'name');
    // ["moe", "larry", "curly"]

     

与函数相关的方法

绑定运行环境和参数

在不同的运行环境下,Javascript函数内部的变量所在的上下文是不同的。这种特性会给程序带来不确定性,为了解决这个问题,Underscore.js提供了两个方法,用来给函数绑定上下文。

(1)bind方法

该方法绑定函数运行时的上下文,返回一个新函数。

  1. var o = {
    p: 2,
    m: function (){console.log(this.p);} }; o.m() // 2 _.bind(o.m,{p:1})() // 1

     

上面代码将o.m方法绑定到一个新的对象上面。

除了前两个参数以外,bind方法还可以接受更多参数,它们表示函数方法运行时所需的参数。

  1. var add = function(n1,n2,n3) {
    console.log(this.sum + n1 + n2 + n3);
    };
    _.bind(add, {sum:1}, 1, 1, 1)() // 4

     

上面代码中bind方法有5个参数,最后那三个是给定add方法的运行参数,所以运行结果为4。

(2)bindall方法

该方法可以一次将多个方法,绑定在某个对象上面。

  1. var o = {
    p1 : '123',
    p2 : '456',
    m1 : function() { console.log(this.p1); }, m2 : function() { console.log(this.p2); }, }; _.bindAll(o, 'm1', 'm2');

     

上面代码一次性将两个方法(m1和m2)绑定在o对象上面。

(3)partial方法

除了绑定上下文,Underscore.js还允许绑定参数。partial方法将函数与某个参数绑定,然后作为一个新函数返回。

  1. var add = function(a, b) { return a + b; };
    add5 = _.partial(add, 5);
    add5(10); // 15

     

(4)wrap方法

该方法将一个函数作为参数,传入另一个函数,最终返回前者的一个新版本。

  1. var hello = function(name) { return "hello: " + name; };
    hello = _.wrap(hello, function(func) { return "before, " + func("moe") + ", after"; }); hello(); // 'before, hello: moe, after'

     

上面代码先定义hello函数,然后将hello传入一个匿名定义,返回一个新版本的hello函数。

(5)compose方法

该方法接受一系列函数作为参数,由后向前依次运行,上一个函数的运行结果,作为后一个函数的运行参数。也就是说,将f(g(),h())的形式转化为f(g(h()))。

  1. var greet = function(name){ return "hi: " + name; };
    var exclaim = function(statement){ return statement + "!"; }; var welcome = _.compose(exclaim, greet); welcome('moe'); // 'hi: moe!'

     

上面代码调用welcome时,先运行greet函数,再运行exclaim函数。并且,greet函数的运行结果是exclaim函数运行时的参数。

函数运行控制

Underscore.js允许对函数运行行为进行控制。

(1)memoize方法

该方法缓存一个函数针对某个参数的运行结果。

  1. var fibonacci = _.memoize(function(n) {
    return n <2 ? n : fibonacci(n - 1) &#43; fibonacci(n - 2);
    });

     

&#xff08;2&#xff09;delay方法

该方法可以将函数推迟指定的时间再运行。

  1. var log &#61; _.bind(console.log, console);
    _.delay(log, 1000, &#39;logged later&#39;);
    // &#39;logged later&#39;

     

上面代码推迟1000毫秒&#xff0c;再运行console.log方法&#xff0c;并且指定参数为“logged later”。

&#xff08;3&#xff09;defer方法

该方法可以将函数推迟到待运行的任务数为0时再运行&#xff0c;类似于setTimeout推迟0秒运行的效果。

  1. _.defer(function(){ alert(&#39;deferred&#39;); });

     

&#xff08;4&#xff09;throttle方法

该方法返回一个函数的新版本。连续调用这个新版本的函数时&#xff0c;必须等待一定时间才会触发下一次执行。

  1. // 返回updatePosition函数的新版本
    var throttled &#61; _.throttle(updatePosition, 100);
    // 新版本的函数每过100毫秒才会触发一次 $(window).scroll(throttled);

     

&#xff08;5&#xff09;debounce方法

该方法返回的新函数有调用的时间限制&#xff0c;每次调用必须与上一次调用间隔一定的时间&#xff0c;否则就无效。它的典型应用是防止用户双击某个按钮&#xff0c;导致两次提交表单。

  1. $("button").on("click", _.debounce(submitForm, 1000, true));

     

上面代码表示click事件发生后&#xff0c;调用函数submitForm的新版本。该版本的两次运行时间&#xff0c;必须间隔1000毫秒以上&#xff0c;否则第二次调用无效。最后那个参数true&#xff0c;表示click事件发生后&#xff0c;立刻触发第一次submitForm函数&#xff0c;否则就是等1000毫秒再触发。

&#xff08;6&#xff09;once方法

该方法返回一个只能运行一次的新函数。该方法主要用于对象的初始化。

  1. var initialize &#61; _.once(createApplication);
    initialize();
    initialize();
    // Application只被创造一次

     

&#xff08;7&#xff09;after方法

该方法返回的新版本函数&#xff0c;只有在被调用一定次数后才会运行&#xff0c;主要用于确认一组操作全部完成后&#xff0c;再做出反应。

  1. var renderNotes &#61; _.after(notes.length, render);
    _.each(notes, function(note) {
    note.asyncSave({success: renderNotes});
    });

     

上面代码表示&#xff0c;函数renderNotes是函数render的新版本&#xff0c;只有调用notes.length次以后才会运行。所以&#xff0c;后面就可以放心地等到notes的每个成员都处理完&#xff0c;才会运行一次renderNotes。

工具方法

链式操作

Underscore.js允许将多个操作写成链式的形式。

  1. _.(users)
    .filter(function(user) { return user.name &#61;&#61;&#61; name })
    .sortBy(function(user) { return user.karma }) .first() .value()

     

template

该方法用于编译html模板。它接受三个参数。

  1. _.template(templateString, [data], [settings])

     

三个参数的含义如下&#xff1a;

  • templateString&#xff1a;模板字符串
  • data&#xff1a;输入模板的数据
  • settings&#xff1a;设置

&#xff08;1&#xff09;templateString

模板字符串templateString就是普通的html语言&#xff0c;其中的变量使用<%&#61; … %>的形式插入&#xff1b;data对象负责提供变量的值。

  1. var txt &#61; "

    <%&#61; word %>

    ";
    _.template(txt, {word : "Hello World"})
    // "

    Hello World

    "

     

如果变量的值包含五个特殊字符&#xff08;& <> ” ‘ /&#xff09;&#xff0c;就需要用<%- … %>转义。

  1. var txt &#61; "

    <%- word %>

    ";
    _.template(txt, {word : "H & W"})
    //

    H & W

     

Javascript命令可以采用<% … %>的形式插入。下面是判断语句的例子。

  1. var txt &#61; "<% var i &#61; 0; if (i<1){ %>"
    &#43; "<%&#61; word %>"
    &#43; "<% } %>";
    _.template(txt, {word : "Hello World"})
    // Hello World

     

常见的用法还有循环语句。

  1. var list &#61; "<% _.each(people, function(name) { %>

  2. <%&#61; name %>
  3. <% }); %>";
    _.template(list, {people : [&#39;moe&#39;, &#39;curly&#39;, &#39;larry&#39;]});
    // "
  4. moe
  5. curly
  6. larry
  7. "

 

如果template方法只有第一个参数templateString&#xff0c;省略第二个参数&#xff0c;那么会返回一个函数&#xff0c;以后可以向这个函数输入数据。

  1. var t1 &#61; _.template("Hello <%&#61;user%>!");
    t1({ user: "" })
    // &#39;Hello !&#39;

     

&#xff08;2&#xff09;data

templateString中的所有变量&#xff0c;在内部都是obj对象的属性&#xff0c;而obj对象就是指第二个参数data对象。下面两句语句是等同的。

  1. _.template("Hello <%&#61;user%>!", { user: "" })
    _.template("Hello <%&#61;obj.user%>!", { user: "" })

     

如果要改变obj这个对象的名字&#xff0c;需要在第三个参数中设定。

  1. _.template("<%if (data.title) { %>Title: <%&#61; title %><% } %>", null,
    { variable: "data" });

     

因为template在变量替换时&#xff0c;内部使用with语句&#xff0c;所以上面这样的做法&#xff0c;运行速度会比较快。


转:https://www.cnblogs.com/catgatp/p/8207090.html



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
author-avatar
石头
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有