• Underscore.js 入门-常用方法介绍


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

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

    上篇介绍了Underscore.js 的几个核心功能:http://www.css88.com/archives/4728

    这里介绍部分的常用方法,详细请API文档 http://www.css88.com/doc/underscore/

    集合相关方法

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

    数组处理

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

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

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

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

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

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

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

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

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

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

    数组特征

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

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

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

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

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

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

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

    数组过滤

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

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

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

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

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

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

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

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

    javascript 代码:
    1. _.contains([1, 2, 3], 3);
    2. // true

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

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

    对象相关方法

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

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

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

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

    与函数相关的方法

    绑定运行环境和参数

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

    (1)bind方法

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

    javascript 代码:
    1. var o = {
    2. p: 2,
    3. m: function (){console.log(this.p);}
    4. };
    5. o.m()
    6. // 2
    7. _.bind(o.m,{p:1})()
    8. // 1

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

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

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

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

    (2)bindall方法

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

    javascript 代码:
    1. var o = {
    2. p1 : '123',
    3. p2 : '456',
    4. m1 : function() { console.log(this.p1); },
    5. m2 : function() { console.log(this.p2); },
    6. };
    7. _.bindAll(o, 'm1', 'm2');

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

    (3)partial方法

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

    javascript 代码:
    1. var add = function(a, b) { return a + b; };
    2. add5 = _.partial(add, 5);
    3. add5(10);
    4. // 15

    (4)wrap方法

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

    javascript 代码:
    1. var hello = function(name) { return "hello: " + name; };
    2. hello = _.wrap(hello, function(func) {
    3. return "before, " + func("moe") + ", after";
    4. });
    5. hello();
    6. // 'before, hello: moe, after'

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

    (5)compose方法

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

    javascript 代码:
    1. var greet = function(name){ return "hi: " + name; };
    2. var exclaim = function(statement){ return statement + "!"; };
    3. var welcome = _.compose(exclaim, greet);
    4. welcome('moe');
    5. // 'hi: moe!'

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

    函数运行控制

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

    (1)memoize方法

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

    javascript 代码:
    1. var fibonacci = _.memoize(function(n) {
    2. return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
    3. });

    (2)delay方法

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

    javascript 代码:
    1. var log = _.bind(console.log, console);
    2. _.delay(log, 1000, 'logged later');
    3. // 'logged later'

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

    (3)defer方法

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

    javascript 代码:
    1. _.defer(function(){ alert('deferred'); });

    (4)throttle方法

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

    javascript 代码:
    1. // 返回updatePosition函数的新版本
    2. var throttled = _.throttle(updatePosition, 100);
    3. // 新版本的函数每过100毫秒才会触发一次
    4. $(window).scroll(throttled);

    (5)debounce方法

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

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

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

    (6)once方法

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

    javascript 代码:
    1. var initialize = _.once(createApplication);
    2. initialize();
    3. initialize();
    4. // Application只被创造一次

    (7)after方法

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

    javascript 代码:
    1. var renderNotes = _.after(notes.length, render);
    2. _.each(notes, function(note) {
    3. note.asyncSave({success: renderNotes});
    4. });

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

    工具方法

    链式操作

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

    javascript 代码:
    1. _.(users)
    2. .filter(function(user) { return user.name === name })
    3. .sortBy(function(user) { return user.karma })
    4. .first()
    5. .value()

    template

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

    javascript 代码:
    1. _.template(templateString, [data], [settings])

    三个参数的含义如下:

    1. templateString:模板字符串
    2. data:输入模板的数据
    3. settings:设置

    (1)templateString

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

    javascript 代码:
    1. var txt = "<h2><%= word %></h2>";
    2. _.template(txt, {word : "Hello World"})
    3. // "<h2>Hello World</h2>"

    如果变量的值包含五个特殊字符(& < > ” ‘ /),就需要用<%- … %>转义。

    javascript 代码:
    1. var txt = "<h2><%- word %></h2>";
    2. _.template(txt, {word : "H & W"})
    3. // <h2>H &amp; W</h2>

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

    javascript 代码:
    1. var txt = "<% var i = 0; if (i<1){ %>"
    2. + "<%= word %>"
    3. + "<% } %>";
    4. _.template(txt, {word : "Hello World"})
    5. // Hello World

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

    javascript 代码:
    1. var list = "<% _.each(people, function(name) { %> <li><%= name %></li> <% }); %>";
    2. _.template(list, {people : ['moe', 'curly', 'larry']});
    3. // "<li>moe</li><li>curly</li><li>larry</li>"

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

    javascript 代码:
    1. var t1 = _.template("Hello <%=user%>!");
    2. t1({ user: "<Jane>" })
    3. // 'Hello <Jane>!'

    (2)data

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

    javascript 代码:
    1. _.template("Hello <%=user%>!", { user: "" })
    2. _.template("Hello <%=obj.user%>!", { user: "" })

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

    javascript 代码:
    1. _.template("<%if (data.title) { %>Title: <%= title %><% } %>", null,{ variable: "data" });

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

  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 32. Longest Valid Parentheses
    leetcode 28. Implement strStr()
    leetcode 27. Remove Element
    leetcode 26. Remove Duplicates from Sorted Array
    leetcode 24. Swap Nodes in Pairs
    leetcode 22. Generate Parentheses
    树莓派的频率管理和热控制
    sql执行insert插入一条记录同时获取刚插入的id
    全程直播个人博客重构过程,采用springboot+dubbo+jpa技术栈。
  • 原文地址:https://www.cnblogs.com/gopark/p/9720140.html
Copyright © 2020-2023  润新知