first batch of documentation

This commit is contained in:
Jeremy Ashkenas
2009-10-26 16:07:09 -04:00
parent 42362a2742
commit 4c41af41e6
4 changed files with 351 additions and 1 deletions

308
index.html Normal file
View File

@@ -0,0 +1,308 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Underscore.js</title>
<style>
body {
font-size: 16px;
line-height: 24px;
background: #f0f0e5;
color: #252519;
font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
}
div.container {
width: 720px;
margin: 0 auto;
margin-top: 50px;
}
p {
width: 550px;
}
#documentation p {
margin-bottom: 8px;
}
a, a:visited {
padding: 0 2px;
text-decoration: none;
background: #dadaba;
color: #252519;
}
a:active, a:hover {
color: #000;
background: #f0c095;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 35px;
}
code, pre {
font-family: Monaco, Consolas, "Lucida Console", monospace;
font-size: 12px;
line-height: 18px;
color: #555529;
}
code {
margin-left: 20px;
}
pre {
font-size: 12px;
padding-left: 12px;
border-left: 6px solid #aaaa99;
margin: 0px 0 35px;
}
</style>
</head>
<body>
<div class="container">
<h1>Underscore.js</h1>
<p>
<a href="http://github.com/documentcloud/underscore/">Underscore</a> is a
utility-belt library for Javascript that provides a lot of the
functional programming support that you would expect in
<a href="http://prototypejs.org/api">Prototype.js</a>
(or <a href="http://www.ruby-doc.org/core/classes/Enumerable.html">Ruby</a>),
but without extending any of the built-in Javascript objects. It's the
tie to go along with <a href="http://docs.jquery.com">jQuery</a>'s tux.
</p>
<p>
Underscore provides 43-odd functions that support both the usual
functional suspects: <b>map</b>, <b>select</b>, <b>invoke</b> &mdash;
as well as more specialized helpers: function binding, javascript
templating, deep equality testing, and so on. It delegates to the built-in
functions, if present, so
<a href="https://developer.mozilla.org/en/New_in_JavaScript_1.6">Javascript 1.6</a>
compliant browsers will use the
native implementations of <b>forEach</b>, <b>map</b>, <b>filter</b>,
<b>every</b> and <b>some</b>.
</p>
<p>
Underscore includes a complete <a href="test/test.html">Test &amp; Benchmark Suite</a>
for your perusal.
</p>
<h2>Table of Contents</h2>
<p>
<b>Collections</b>
<br />
<span class="methods"><a href="#each">each</a>, <a href="#map">map</a>,
<a href="#inject">inject</a>, <a href="#detect">detect</a>, <a href="#select">select</a>, <a href="#reject">reject</a>, <a href="#all">all</a>,
<a href="#any">any</a>, <a href="#include">include</a>, <a href="#invoke">invoke</a>, <a href="#pluck">pluck</a>, <a href="#max">max</a>,
<a href="#min">min</a>, <a href="#sortBy">sortBy</a>, <a href="#sortedIndex">sortedIndex</a>, <a href="#toArray">toArray</a>,
<a href="#size">size</a></span>
</p>
<p>
<b>Arrays</b>
<br />
<span class="methods"><a href="#first">first</a>, <a href="#last">last</a>,
<a href="#compact">compact</a>, <a href="#flatten">flatten</a>, <a href="#without">without</a>, <a href="#uniq">uniq</a>,
<a href="#intersect">intersect</a>, <a href="#zip">zip</a>, <a href="#indexOf">indexOf</a></span>
</p>
<p>
<b>Objects</b>
<br />
<span class="methods"><a href="#keys">keys</a>, <a href="#values">values</a>,
<a href="#extend">extend</a>, <a href="#clone">clone</a>, <a href="#isEqual">isEqual</a>, <a href="#isElement">isElement</a>,
<a href="#isArray">isArray</a>, <a href="#isFunction">isFunction</a>, <a href="#isUndefined">isUndefined</a>, <a href="#toString">toString</a>
</span>
</p>
<p>
<b>Functions</b>
<br />
<span class="methods"><a href="#bind">bind</a>, <a href="#bindAll">bindAll</a>, <a href="#delay">delay</a>,
<a href="#defer">defer</a>, <a href="#wrap">wrap</a></span>
</p>
<p>
<b>Utility</b>
<br />
<span class="methods"><a href="#uniqueId">uniqueId</a>, <a href="#template">template</a></span>
</p>
<div id="documentation">
<h2>Collections</h2>
<p id="each">
<b>each</b><code>_.each(list, iterator, [context])</code>
<br />
Iterates over a <b>list</b> of elements, yielding each in turn to an <b>iterator</b>
function. The <b>iterator</b> is bound to the <b>context</b> object, if one is
passed. If <b>list</b> is a Javascript object, a pair with <b>key</b>
and <b>value</b> properties will be yielded. Delegates to the native
<b>forEach</b> method if it exists.
</p>
<pre>
_.each([1, 2, 3], function(num){ alert(num); });
=> alerts each number in turn...</pre>
<p id="map">
<b>map</b><code>_.map(list, iterator, [context])</code>
<br />
Produces a new array of values by mapping each value in <b>list</b>
through a transformation function (<b>iterator</b>). If the native
<b>map</b> method exists, it will be used instead.
</p>
<pre>
_.map([1, 2, 3], function(num){ return num * 3 });
=> [3, 6, 9]</pre>
<p id="inject">
<b>inject</b><code>_.inject(list, memo, iterator, [context])</code>
<br />
Also known as <b>reduce</b> and <b>foldl</b>, <b>inject</b> reduces a
<b>list</b> of values into a single value. <b>Memo</b> is the initial state
of the reduction, and each successive step of it should be returned by
<b>iterator</b>.
</p>
<pre>
var sum = _.inject([1, 2, 3], 0, function(memo, num){ return memo + num });
=> 6
</pre>
<p id="detect">
<b>detect</b><code>_.detect(list, iterator, [context])</code>
<br />
Looks through each value in the <b>list</b>, returning the first one that
passes a truth test (<b>iterator</b>). The function returns as
soon as it finds the true element, and doesn't continue to traverse
the list.
</p>
<pre>
var even = _.detect([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> 2
</pre>
<p id="select">
<b>select</b><code>_.select(list, iterator, [context])</code>
<br />
Looks through each value in the <b>list</b>, returning an array of all
the values that pass a truth test (<b>iterator</b>). Delegates to the
native <b>filter</b> method, if it exists.
</p>
<pre>
var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]
</pre>
<p id="reject">
<b>reject</b><code>_.reject(list, iterator, [context])</code>
<br />
Returns the values in <b>list</b> without the elements that the truth
test (<b>iterator</b>) passes. The opposite of <b>select</b>.
</p>
<pre>
var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [1, 3, 5]
</pre>
<p id="all">
<b>all</b><code>_.(list, [iterator], [context])</code>
<br />
Returns <i>true</i> if all of the values in the <b>list</b> pass the <b>iterator</b>
truth test. If an <b>iterator</b> is not provided, the truthy value of
the element will be used instead. Delegates to the native method <b>every</b>, if
present.
</p>
<pre>
_.all([true, 1, null, 'yes']);
=> false
</pre>
<p id="any">
<b>any</b><code>_.(list, iterator, [context])</code>
<br />
Returns <i>true</i> if any of the values in the <b>list</b> pass the
<b>iterator</b> truth test. Short-circuits and stops traversing the list
if a true element is found. Delegates to the native method <b>some</b>,
if present.
</p>
<pre>
_.any([null, 0, 'yes', false]);
=> true
</pre>
<p id="">
<b>include</b><code>_.(list, iterator, [context])</code>
<br />
</p>
<pre>
</pre>
<p id="">
<b>invoke</b><code>_.(list, iterator, [context])</code>
<br />
</p>
<pre>
</pre>
<p id="">
<b>pluck</b><code>_.(list, iterator, [context])</code>
<br />
</p>
<pre>
</pre>
<p id="">
<b>max</b><code>_.(list, iterator, [context])</code>
<br />
</p>
<pre>
</pre>
<p id="">
<b>min</b><code>_.(list, iterator, [context])</code>
<br />
</p>
<pre>
</pre>
<p id="">
<b>sortBy</b><code>_.(list, iterator, [context])</code>
<br />
</p>
<pre>
</pre>
<p id="">
<b>sortedIndex</b><code>_.(list, iterator, [context])</code>
<br />
</p>
<pre>
</pre>
<p id="">
<b>toArray</b><code>_.(list, iterator, [context])</code>
<br />
</p>
<pre>
</pre>
<p id="">
<b>size</b><code>_.(list, iterator, [context])</code>
<br />
</p>
<pre>
</pre>
</div>
</div>
</body>
</html>

View File

@@ -29,4 +29,23 @@ $(document).ready(function() {
equals(curly.sayHi(), 'hi: moe', 'bound function is still bound to original object'); equals(curly.sayHi(), 'hi: moe', 'bound function is still bound to original object');
}); });
asyncTest("functions: delay", function() {
var delayed = false;
_.delay(function(){ delayed = true; }, 100);
_.delay(function(){ ok(!delayed, "didn't delay the function quite yet"); }, 50);
_.delay(function(){ ok(delayed, 'delayed the function'); start(); }, 150);
});
asyncTest("functions: defer", function() {
var deferred = false;
_.defer(function(bool){ deferred = bool; }, true);
_.delay(function(){ ok(deferred, "deferred the function"); start(); }, 50);
});
test("functions: wrap", function() {
var greet = function(name){ return "hi: " + name; };
var backwards = _.wrap(greet, function(func, name){ return func(name) + ' ' + name.split('').reverse().join(''); });
equals(backwards('moe'), 'hi: moe eom', 'wrapped the saluation function');
});
}); });

View File

@@ -9,8 +9,8 @@
<script type="text/javascript" src="../underscore.js"></script> <script type="text/javascript" src="../underscore.js"></script>
<script type="text/javascript" src="collections.js"></script> <script type="text/javascript" src="collections.js"></script>
<script type="text/javascript" src="arrays.js"></script> <script type="text/javascript" src="arrays.js"></script>
<script type="text/javascript" src="functions.js"></script>
<script type="text/javascript" src="objects.js"></script> <script type="text/javascript" src="objects.js"></script>
<script type="text/javascript" src="functions.js"></script>
<script type="text/javascript" src="utility.js"></script> <script type="text/javascript" src="utility.js"></script>
<script type="text/javascript" src="speed.js"></script> <script type="text/javascript" src="speed.js"></script>
</head> </head>

View File

@@ -283,6 +283,29 @@ window._ = {
}); });
}, },
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
delay : function(func, wait) {
var args = _.toArray(arguments).slice(2);
return window.setTimeout(function(){ return func.apply(func, args); }, wait);
},
// Defers a function, scheduling it to run after the current call stack has
// cleared.
defer : function(func) {
return _.delay.apply(_, [func, 1].concat(_.toArray(arguments).slice(1)));
},
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
wrap : function(func, wrapper) {
return function() {
var args = [func].concat(_.toArray(arguments));
return wrapper.apply(wrapper, args);
};
},
/* ---------------- The following methods apply to objects ---------------- */ /* ---------------- The following methods apply to objects ---------------- */
// Retrieve the names of an object's properties. // Retrieve the names of an object's properties.