http://documentcloud.github.com/underscore/</p></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-3"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-3">#</a></div><h2>Baseline setup</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-4"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-4">#</a></div><p>Establish the root object, <code>window</code> in the browser, or <code>global</code> on the server.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">root = </span><spanclass="k">this</span></pre></div></td></tr><trid="section-5"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-5">#</a></div><p>Save the previous value of the <code>_</code> variable.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">previousUnderscore = </span><spanclass="nx">root</span><spanclass="p">.</span><spanclass="nx">_</span></pre></div></td></tr><trid="section-6"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-6">#</a></div><p>Establish the object that gets thrown to break out of a loop iteration.
<code>StopIteration</code> is SOP on Mozilla.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">breaker = </span><spanclass="k">if</span><spanclass="k">typeof</span><spanclass="p">(</span><spanclass="nx">StopIteration</span><spanclass="p">)</span><spanclass="o">is</span><spanclass="s1">'undefined'</span><spanclass="k">then</span><spanclass="s1">'__break__'</span><spanclass="k">else</span><spanclass="nx">StopIteration</span></pre></div></td></tr><trid="section-7"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-7">#</a></div><p>Helper function to escape <strong>RegExp</strong> contents, because JS doesn't have one.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">escapeRegExp = </span><spanclass="p">(</span><spanclass="nx">string</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">string</span><spanclass="p">.</span><spanclass="nx">replace</span><spanclass="p">(</span><spanclass="sr">/([.*+?^${}()|[\]\/\\])/g</span><spanclass="p">,</span><spanclass="s1">'\\$1'</span><spanclass="p">)</span></pre></div></td></tr><trid="section-8"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-8">#</a></div><p>Save bytes in the minified (but not gzipped) version:</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">ArrayProto = </span><spanclass="nb">Array</span><spanclass="p">.</span><spanclass="nx">prototype</span>
<spanclass="nv">ObjProto = </span><spanclass="nb">Object</span><spanclass="p">.</span><spanclass="nx">prototype</span></pre></div></td></tr><trid="section-9"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-9">#</a></div><p>Create quick reference variables for speed access to core prototypes.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">slice = </span><spanclass="nx">ArrayProto</span><spanclass="p">.</span><spanclass="nx">slice</span>
<spanclass="nv">propertyIsEnumerable = </span><spanclass="nx">ObjProto</span><spanclass="p">.</span><spanclass="nx">propertyIsEnumerable</span></pre></div></td></tr><trid="section-10"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-10">#</a></div><p>All <strong>ECMA5</strong> native implementations we hope to use are declared here.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">nativeForEach = </span><spanclass="nx">ArrayProto</span><spanclass="p">.</span><spanclass="nx">forEach</span>
<spanclass="nv">nativeKeys = </span><spanclass="nb">Object</span><spanclass="p">.</span><spanclass="nx">keys</span></pre></div></td></tr><trid="section-11"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-11">#</a></div><p>Create a safe reference to the Underscore object for use below.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_ = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="k">new</span><spanclass="nx">wrapper</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span></pre></div></td></tr><trid="section-12"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-12">#</a></div><p>Export the Underscore object for <strong>CommonJS</strong>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">if</span><spanclass="k">typeof</span><spanclass="p">(</span><spanclass="nx">exports</span><spanclass="p">)</span><spanclass="o">!=</span><spanclass="s1">'undefined'</span><spanclass="k">then</span><spanclass="nv">exports._ = </span><spanclass="nx">_</span></pre></div></td></tr><trid="section-13"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-13">#</a></div><p>Export Underscore to global scope.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">root._ = </span><spanclass="nx">_</span></pre></div></td></tr><trid="section-14"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-14">#</a></div><p>Current version.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.VERSION = </span><spanclass="s1">'1.1.0'</span></pre></div></td></tr><trid="section-15"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-15">#</a></div><h2>Collection Functions</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-16"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-16">#</a></div><p>The cornerstone, an <strong>each</strong> implementation.
Handles objects implementing <strong>forEach</strong>, arrays, and raw objects.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.each = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">obj</span></pre></div></td></tr><trid="section-17"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-17">#</a></div><p>Return the results of applying the iterator to each element. Use JavaScript
1.6's version of <strong>map</strong>, if possible.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.map = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">results</span></pre></div></td></tr><trid="section-18"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-18">#</a></div><p><strong>Reduce</strong> builds up a single result from a list of values. Also known as
<strong>inject</strong>, or <strong>foldl</strong>. Uses JavaScript 1.8's version of <strong>reduce</strong>, if possible.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.reduce = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">memo</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">memo</span></pre></div></td></tr><trid="section-19"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-19">#</a></div><p>The right-associative version of <strong>reduce</strong>, also known as <strong>foldr</strong>. Uses
JavaScript 1.8's version of <strong>reduceRight</strong>, if available.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.reduceRight = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">memo</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">reduce</span><spanclass="nx">reversed</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">memo</span><spanclass="p">,</span><spanclass="nx">context</span></pre></div></td></tr><trid="section-20"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-20">#</a></div><p>Return the first value which passes a truth test.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.detect = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">result</span></pre></div></td></tr><trid="section-21"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-21">#</a></div><p>Return all the elements that pass a truth test. Use JavaScript 1.6's
<strong>filter</strong>, if it exists.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.filter = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">results</span></pre></div></td></tr><trid="section-22"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-22">#</a></div><p>Return all the elements for which a truth test fails.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.reject = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">results</span></pre></div></td></tr><trid="section-23"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-23">#</a></div><p>Determine whether all of the elements match a truth test. Delegate to
JavaScript 1.6's <strong>every</strong>, if it is present.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.every = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">result</span></pre></div></td></tr><trid="section-24"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-24">#</a></div><p>Determine if at least one element in the object matches a truth test. Use
JavaScript 1.6's <strong>some</strong>, if it exists.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.some = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">result</span></pre></div></td></tr><trid="section-25"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-25">#</a></div><p>Determine if a given value is included in the array or object,
based on <code>===</code>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.include = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">target</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="kc">false</span></pre></div></td></tr><trid="section-26"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-26">#</a></div><p>Invoke a method with arguments on every item in a collection.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.invoke = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">method</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="p">(</span><spanclass="k">if</span><spanclass="nx">method</span><spanclass="k">then</span><spanclass="nx">val</span><spanclass="p">[</span><spanclass="nx">method</span><spanclass="p">]</span><spanclass="k">else</span><spanclass="nx">val</span><spanclass="p">).</span><spanclass="nx">apply</span><spanclass="p">(</span><spanclass="nx">val</span><spanclass="p">,</span><spanclass="nx">args</span><spanclass="p">)</span><spanclass="k">for</span><spanclass="nx">val</span><spanclass="k">in</span><spanclass="nx">obj</span></pre></div></td></tr><trid="section-27"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-27">#</a></div><p>Convenience version of a common use case of <strong>map</strong>: fetching a property.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.pluck = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">key</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">map</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="p">(</span><spanclass="nx">val</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">val</span><spanclass="p">[</span><spanclass="nx">key</span><spanclass="p">])</span></pre></div></td></tr><trid="section-28"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-28">#</a></div><p>Return the maximum item or (item-based computation).</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.max = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">result</span><spanclass="p">.</span><spanclass="nx">value</span></pre></div></td></tr><trid="section-29"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-29">#</a></div><p>Return the minimum element (or element-based computation).</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.min = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">result</span><spanclass="p">.</span><spanclass="nx">value</span></pre></div></td></tr><trid="section-30"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-30">#</a></div><p>Sort the object's values by a criterion produced by an iterator.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.sortBy = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="p">)),</span><spanclass="s1">'value'</span><spanclass="p">)</span></pre></div></td></tr><trid="section-31"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-31">#</a></div><p>Use a comparator function to figure out at what index an object should
be inserted so as to maintain order. Uses binary search.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.sortedIndex = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">,</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">low</span></pre></div></td></tr><trid="section-32"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-32">#</a></div><p>Convert anything iterable into a real, live array.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.toArray = </span><spanclass="p">(</span><spanclass="nx">iterable</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">values</span><spanclass="p">(</span><spanclass="nx">iterable</span><spanclass="p">)</span></pre></div></td></tr><trid="section-33"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-33">#</a></div><p>Return the number of elements in an object.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.size = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">toArray</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">).</span><spanclass="nx">length</span></pre></div></td></tr><trid="section-34"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-34">#</a></div><h2>Array Functions</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-35"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-35">#</a></div><p>Get the first element of an array. Passing <code>n</code> will return the first N
with <strong>map</strong>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.first = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">,</span><spanclass="nx">n</span><spanclass="p">,</span><spanclass="nx">guard</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="k">if</span><spanclass="nx">n</span><spanclass="o">and</span><spanclass="o">not</span><spanclass="nx">guard</span><spanclass="k">then</span><spanclass="nx">slice</span><spanclass="p">.</span><spanclass="nx">call</span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">,</span><spanclass="mi">0</span><spanclass="p">,</span><spanclass="nx">n</span><spanclass="p">)</span><spanclass="k">else</span><spanclass="nx">array</span><spanclass="p">[</span><spanclass="mi">0</span><spanclass="p">]</span></pre></div></td></tr><trid="section-36"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-36">#</a></div><p>Returns everything but the first entry of the array. Aliased as <strong>tail</strong>.
check allows it to work with <strong>map</strong>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.rest = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">,</span><spanclass="nx">index</span><spanclass="p">,</span><spanclass="nx">guard</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">slice</span><spanclass="p">.</span><spanclass="nx">call</span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">,</span><spanclass="k">if</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">isUndefined</span><spanclass="p">(</span><spanclass="nx">index</span><spanclass="p">)</span><spanclass="o">or</span><spanclass="nx">guard</span><spanclass="k">then</span><spanclass="mi">1</span><spanclass="k">else</span><spanclass="nx">index</span><spanclass="p">)</span></pre></div></td></tr><trid="section-37"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-37">#</a></div><p>Get the last element of an array.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.last = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">array</span><spanclass="p">[</span><spanclass="nx">array</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">-</span><spanclass="mi">1</span><spanclass="p">]</span></pre></div></td></tr><trid="section-38"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-38">#</a></div><p>Trim out all falsy values from an array.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.compact = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">item</span><spanclass="k">for</span><spanclass="nx">item</span><spanclass="k">in</span><spanclass="nx">array</span><spanclass="k">when</span><spanclass="nx">item</span></pre></div></td></tr><trid="section-39"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-39">#</a></div><p>Return a completely flattened version of an array.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.flatten = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="p">,</span><spanclass="p">[]</span></pre></div></td></tr><trid="section-40"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-40">#</a></div><p>Return a version of the array that does not contain the specified value(s).</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.without = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">val</span><spanclass="k">for</span><spanclass="nx">val</span><spanclass="k">in</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">toArray</span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">)</span><spanclass="k">when</span><spanclass="o">not</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">include</span><spanclass="nx">values</span><spanclass="p">,</span><spanclass="nx">val</span></pre></div></td></tr><trid="section-41"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-41">#</a></div><p>Produce a duplicate-free version of the array. If the array has already
been sorted, you have the option of using a faster algorithm.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.uniq = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">,</span><spanclass="nx">isSorted</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">memo</span></pre></div></td></tr><trid="section-42"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-42">#</a></div><p>Produce an array that contains every item shared between all the
<spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">indexOf</span><spanclass="p">(</span><spanclass="nx">other</span><spanclass="p">,</span><spanclass="nx">item</span><spanclass="p">)</span><spanclass="o">>=</span><spanclass="mi">0</span></pre></div></td></tr><trid="section-43"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-43">#</a></div><p>Zip together multiple lists into a single array -- elements that share
an index go together.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.zip = </span><spanclass="o">-></span>
<spanclass="nx">results</span></pre></div></td></tr><trid="section-44"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-44">#</a></div><p>If the browser doesn't supply us with <strong>indexOf</strong> (I'm looking at you, MSIE),
item in an array, or -1 if the item is not included in the array.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.indexOf = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">,</span><spanclass="nx">item</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="o">-</span><spanclass="mi">1</span></pre></div></td></tr><trid="section-45"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-45">#</a></div><p>Provide JavaScript 1.6's <strong>lastIndexOf</strong>, delegating to the native function,
if possible.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.lastIndexOf = </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">,</span><spanclass="nx">item</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="o">-</span><spanclass="mi">1</span></pre></div></td></tr><trid="section-46"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-46">#</a></div><p>Generate an integer Array containing an arithmetic progression. A port of
<spanclass="nx">i</span><spanclass="o">+=</span><spanclass="nx">step</span></pre></div></td></tr><trid="section-47"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-47">#</a></div><h2>Function Functions</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-48"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-48">#</a></div><p>Create a function bound to a given object (assigning <code>this</code>, and arguments,
optionally). Binding with arguments is also known as <strong>curry</strong>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.bind = </span><spanclass="p">(</span><spanclass="nx">func</span><spanclass="p">,</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="o">-></span><spanclass="nx">func</span><spanclass="p">.</span><spanclass="nx">apply</span><spanclass="nx">obj</span><spanclass="o">or</span><spanclass="nx">root</span><spanclass="p">,</span><spanclass="nx">args</span><spanclass="p">.</span><spanclass="nx">concat</span><spanclass="nx">arguments</span></pre></div></td></tr><trid="section-49"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-49">#</a></div><p>Bind all of an object's methods to that object. Useful for ensuring that
all callbacks defined on an object belong to it.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.bindAll = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">obj</span></pre></div></td></tr><trid="section-50"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-50">#</a></div><p>Delays a function for the given number of milliseconds, and then calls
it with the arguments supplied.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.delay = </span><spanclass="p">(</span><spanclass="nx">func</span><spanclass="p">,</span><spanclass="nx">wait</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">setTimeout</span><spanclass="p">((</span><spanclass="o">-></span><spanclass="nx">func</span><spanclass="p">.</span><spanclass="nx">apply</span><spanclass="p">(</span><spanclass="nx">func</span><spanclass="p">,</span><spanclass="nx">args</span><spanclass="p">)),</span><spanclass="nx">wait</span><spanclass="p">)</span></pre></div></td></tr><trid="section-51"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-51">#</a></div><p>Memoize an expensive function by storing its results.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.memoize = </span><spanclass="p">(</span><spanclass="nx">func</span><spanclass="p">,</span><spanclass="nx">hasher</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">memo</span><spanclass="p">[</span><spanclass="nx">key</span><spanclass="p">]</span><spanclass="o">=</span><spanclass="nx">func</span><spanclass="p">.</span><spanclass="nx">apply</span><spanclass="k">this</span><spanclass="p">,</span><spanclass="nx">arguments</span></pre></div></td></tr><trid="section-52"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-52">#</a></div><p>Defers a function, scheduling it to run after the current call stack has
<spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">delay</span><spanclass="p">.</span><spanclass="nx">apply</span><spanclass="nx">_</span><spanclass="p">,</span><spanclass="p">[</span><spanclass="nx">func</span><spanclass="p">,</span><spanclass="mi">1</span><spanclass="p">].</span><spanclass="nx">concat</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">rest</span><spanclass="nx">arguments</span></pre></div></td></tr><trid="section-53"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-53">#</a></div><p>Returns the first function passed as an argument to the second,
conditionally execute the original function.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.wrap = </span><spanclass="p">(</span><spanclass="nx">func</span><spanclass="p">,</span><spanclass="nx">wrapper</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="o">-></span><spanclass="nx">wrapper</span><spanclass="p">.</span><spanclass="nx">apply</span><spanclass="nx">wrapper</span><spanclass="p">,</span><spanclass="p">[</span><spanclass="nx">func</span><spanclass="p">].</span><spanclass="nx">concat</span><spanclass="nx">arguments</span></pre></div></td></tr><trid="section-54"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-54">#</a></div><p>Returns a function that is the composition of a list of functions, each
consuming the return value of the function that follows.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.compose = </span><spanclass="o">-></span>
<spanclass="nx">args</span><spanclass="p">[</span><spanclass="mi">0</span><spanclass="p">]</span></pre></div></td></tr><trid="section-55"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-55">#</a></div><h2>Object Functions</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-56"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-56">#</a></div><p>Retrieve the names of an object's properties.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.keys = </span><spanclass="nx">nativeKeys</span><spanclass="o">or</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">key</span><spanclass="k">for</span><spanclass="nx">key</span><spanclass="p">,</span><spanclass="nx">val</span><spanclass="k">of</span><spanclass="nx">obj</span></pre></div></td></tr><trid="section-57"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-57">#</a></div><p>Retrieve the values of an object's properties.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.values = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">map</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">identity</span></pre></div></td></tr><trid="section-58"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-58">#</a></div><p>Return a sorted list of the function names available in Underscore.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.functions = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">filter</span><spanclass="p">(</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">keys</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">),</span><spanclass="p">(</span><spanclass="nx">key</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">isFunction</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">[</span><spanclass="nx">key</span><spanclass="p">])).</span><spanclass="nx">sort</span><spanclass="p">()</span></pre></div></td></tr><trid="section-59"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-59">#</a></div><p>Extend a given object with all of the properties in a source object.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.extend = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">obj</span></pre></div></td></tr><trid="section-60"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-60">#</a></div><p>Create a (shallow-cloned) duplicate of an object.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.clone = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">extend</span><spanclass="p">{},</span><spanclass="nx">obj</span></pre></div></td></tr><trid="section-61"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-61">#</a></div><p>Invokes interceptor with the obj, and then returns obj.
The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.tap = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">interceptor</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">obj</span></pre></div></td></tr><trid="section-62"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-62">#</a></div><p>Perform a deep comparison to check if two objects are equal.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isEqual = </span><spanclass="p">(</span><spanclass="nx">a</span><spanclass="p">,</span><spanclass="nx">b</span><spanclass="p">)</span><spanclass="o">-></span></pre></div></td></tr><trid="section-63"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-63">#</a></div><p>Check object identity.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">return</span><spanclass="kc">true</span><spanclass="k">if</span><spanclass="nx">a</span><spanclass="o">is</span><spanclass="nx">b</span></pre></div></td></tr><trid="section-64"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-64">#</a></div><p>Different types?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">atype = </span><spanclass="k">typeof</span><spanclass="p">(</span><spanclass="nx">a</span><spanclass="p">);</span><spanclass="nv">btype = </span><spanclass="k">typeof</span><spanclass="p">(</span><spanclass="nx">b</span><spanclass="p">)</span>
<spanclass="k">return</span><spanclass="kc">false</span><spanclass="k">if</span><spanclass="nx">atype</span><spanclass="o">isnt</span><spanclass="nx">btype</span></pre></div></td></tr><trid="section-65"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-65">#</a></div><p>Basic equality test (watch out for coercions).</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">return</span><spanclass="kc">true</span><spanclass="k">if</span><spanclass="o">`</span><spanclass="nx">a</span><spanclass="o">==</span><spanclass="nx">b</span><spanclass="o">`</span></pre></div></td></tr><trid="section-66"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-66">#</a></div><p>One is falsy and the other truthy.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">return</span><spanclass="kc">false</span><spanclass="k">if</span><spanclass="p">(</span><spanclass="o">!</span><spanclass="nx">a</span><spanclass="o">and</span><spanclass="nx">b</span><spanclass="p">)</span><spanclass="o">or</span><spanclass="p">(</span><spanclass="nx">a</span><spanclass="o">and</span><spanclass="o">!</span><spanclass="nx">b</span><spanclass="p">)</span></pre></div></td></tr><trid="section-67"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-67">#</a></div><p>One of them implements an <code>isEqual()</code>?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">return</span><spanclass="nx">a</span><spanclass="p">.</span><spanclass="nx">isEqual</span><spanclass="p">(</span><spanclass="nx">b</span><spanclass="p">)</span><spanclass="k">if</span><spanclass="nx">a</span><spanclass="p">.</span><spanclass="nx">isEqual</span></pre></div></td></tr><trid="section-68"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-68">#</a></div><p>Check dates' integer values.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">return</span><spanclass="nx">a</span><spanclass="p">.</span><spanclass="nx">getTime</span><spanclass="p">()</span><spanclass="o">is</span><spanclass="nx">b</span><spanclass="p">.</span><spanclass="nx">getTime</span><spanclass="p">()</span><spanclass="k">if</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">isDate</span><spanclass="p">(</span><spanclass="nx">a</span><spanclass="p">)</span><spanclass="o">and</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">isDate</span><spanclass="p">(</span><spanclass="nx">b</span><spanclass="p">)</span></pre></div></td></tr><trid="section-69"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-69">#</a></div><p>Both are NaN?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">return</span><spanclass="kc">false</span><spanclass="k">if</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nb">isNaN</span><spanclass="p">(</span><spanclass="nx">a</span><spanclass="p">)</span><spanclass="o">and</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nb">isNaN</span><spanclass="p">(</span><spanclass="nx">
<spanclass="nx">a</span><spanclass="p">.</span><spanclass="nx">multiline</span><spanclass="o">is</span><spanclass="nx">b</span><spanclass="p">.</span><spanclass="nx">multiline</span></pre></div></td></tr><trid="section-71"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-71">#</a></div><p>If a is not an object by this point, we can't handle it.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">return</span><spanclass="kc">false</span><spanclass="k">if</span><spanclass="nx">atype</span><spanclass="o">isnt</span><spanclass="s1">'object'</span></pre></div></td></tr><trid="section-72"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-72">#</a></div><p>Check for different array lengths before comparing contents.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">return</span><spanclass="kc">false</span><spanclass="k">if</span><spanclass="nx">a</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">and</span><spanclass="p">(</span><spanclass="nx">a</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">isnt</span><spanclass="nx">b</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="p">)</span></pre></div></td></tr><trid="section-73"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-73">#</a></div><p>Nothing else worked, deep compare the contents.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">aKeys = </span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">keys</span><spanclass="p">(</span><spanclass="nx">a</span><spanclass="p">);</span><spanclass="nv">bKeys = </span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">keys</span><spanclass="p">(</span><spanclass="nx">b</span><spanclass="p">)</span></pre></div></td></tr><trid="section-74"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-74">#</a></div><p>Different object sizes?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">return</span><spanclass="kc">false</span><spanclass="k">if</span><spanclass="nx">aKeys</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">isnt</span><spanclass="nx">bKeys</span><spanclass="p">.</span><spanclass="nx">length</span></pre></div></td></tr><trid="section-75"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-75">#</a></div><p>Recursive comparison of contents.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="p">(</span><spanclass="k">return</span><spanclass="kc">false</span><spanclass="p">)</span><spanclass="k">for</span><spanclass="nx">all</span><spanclass="nx">key</span><spanclass="p">,</span><spanclass="nx">val</span><spanclass="k">of</span><spanclass="nx">a</span><spanclass="k">when</span><spanclass="o">!</span><spanclass="p">(</span><spanclass="nx">key</span><spanclass="k">of</span><spanclass="nx">b</span><spanclass="p">)</span><spanclass="o">or</span><spanclass="o">!</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="
<spanclass="kc">true</span></pre></div></td></tr><trid="section-76"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-76">#</a></div><p>Is a given array or object empty?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isEmpty = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-77"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-77">#</a></div><p>Is a given value a DOM element?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isElement = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">obj</span><spanclass="o">and</span><spanclass="nx">obj</span><spanclass="p">.</span><spanclass="nx">nodeType</span><spanclass="o">is</span><spanclass="mi">1</span></pre></div></td></tr><trid="section-78"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-78">#</a></div><p>Is a given value an array?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isArray = </span><spanclass="nx">nativeIsArray</span><spanclass="o">or</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="o">!!</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="o">and</span><spanclass="nx">obj</span><spanclass="p">.</span><spanclass="nx">concat</span><spanclass="o">and</span><spanclass="nx">obj</span><spanclass="p">.</span><spanclass="nx">unshift</span><spanclass="o">and</span><spanclass="o">not</span><spanclass="nx">obj</span><spanclass="p">.</span><spanclass="nx">callee</span><spanclass="p">)</span></pre></div></td></tr><trid="section-79"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-79">#</a></div><p>Is a given variable an arguments object?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isArguments = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">obj</span><spanclass="o">and</span><spanclass="nx">obj</span><spanclass="p">.</span><spanclass="nx">callee</span></pre></div></td></tr><trid="section-80"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-80">#</a></div><p>Is the given value a function?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isFunction = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="o">!!</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="o">and</span><spanclass="nx">obj</span><spanclass="p">.</span><spanclass="nx">constructor</span><spanclass="o">and</span><spanclass="nx">obj</span><spanclass="p">.</span><spanclass="nx">call</span><spanclass="o">and</span><spanclass="nx">obj</span><spanclass="p">.</span><spanclass="nx">apply</span><spanclass="p">)</span></pre></div></td></tr><trid="section-81"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-81">#</a></div><p>Is the given value a string?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isString = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="o">!!</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="o">i
<code>isNaN(undefined) == true</code>, so we make sure it's a number first.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isNaN = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">isNumber</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">and</span><spanclass="nb">window</span><spanclass="p">.</span><spanclass="nb">isNaN</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span></pre></div></td></tr><trid="section-87"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-87">#</a></div><p>Is a given value equal to null?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isNull = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">obj</span><spanclass="o">is</span><spanclass="kc">null</span></pre></div></td></tr><trid="section-88"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-88">#</a></div><p>Is a given variable undefined?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.isUndefined = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="k">typeof</span><spanclass="nx">obj</span><spanclass="o">is</span><spanclass="s1">'undefined'</span></pre></div></td></tr><trid="section-89"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-89">#</a></div><h2>Utility Functions</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-90"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-90">#</a></div><p>Run Underscore.js in noConflict mode, returning the <code>_</code> variable to its
previous owner. Returns a reference to the Underscore object.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.noConflict = </span><spanclass="o">-></span>
<spanclass="k">this</span></pre></div></td></tr><trid="section-91"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-91">#</a></div><p>Keep the identity function around for default iterators.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.identity = </span><spanclass="p">(</span><spanclass="nx">value</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">value</span></pre></div></td></tr><trid="section-92"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-92">#</a></div><p>Run a function <code>n</code> times.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.times = </span><spanclass="p">(</span><spanclass="nx">n</span><spanclass="p">,</span><spanclass="nx">iterator</span><spanclass="p">,</span><spanclass="nx">context</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">iterator</span><spanclass="p">.</span><spanclass="nx">call</span><spanclass="p">(</span><spanclass="nx">context</span><spanclass="p">,</span><spanclass="nx">i</span><spanclass="p">)</span><spanclass="k">for</span><spanclass="nx">i</span><spanclass="k">in</span><spanclass="p">[</span><spanclass="mi">0</span><spanclass="p">...</span><spanclass="nx">n</span><spanclass="p">]</span></pre></div></td></tr><trid="section-93"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-93">#</a></div><p>Break out of the middle of an iteration.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.breakLoop = </span><spanclass="o">-></span><spanclass="k">throw</span><spanclass="nx">breaker</span></pre></div></td></tr><trid="section-94"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-94">#</a></div><p>Add your own custom functions to the Underscore object, ensuring that
they're correctly added to the OOP wrapper as well.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.mixin = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">addToWrapper</span><spanclass="nx">name</span><spanclass="p">,</span><spanclass="nx">_</span><spanclass="p">[</span><spanclass="nx">name</span><spanclass="p">]</span><spanclass="o">=</span><spanclass="nx">obj</span><spanclass="p">[</span><spanclass="nx">name</span><spanclass="p">]</span></pre></div></td></tr><trid="section-95"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-95">#</a></div><p>Generate a unique integer id (unique within the entire client session).
Useful for temporary DOM ids.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">idCounter = </span><spanclass="mi">0</span>
<spanclass="p">(</span><spanclass="nx">prefix</span><spanclass="o">or</span><spanclass="s1">''</span><spanclass="p">)</span><spanclass="o">+</span><spanclass="nx">idCounter</span><spanclass="o">++</span></pre></div></td></tr><trid="section-96"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-96">#</a></div><p>By default, Underscore uses <strong>ERB</strong>-style template delimiters, change the
following template settings to use alternative delimiters.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.templateSettings = </span><spanclass="p">{</span>
<spanclass="p">}</span></pre></div></td></tr><trid="section-97"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-97">#</a></div><p>JavaScript templating a-la <strong>ERB</strong>, pilfered from John Resig's
With alterations for arbitrary delimiters, and to preserve whitespace.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">_.template = </span><spanclass="p">(</span><spanclass="nx">str</span><spanclass="p">,</span><spanclass="nx">data</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nv">_.methods = </span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">functions</span></pre></div></td></tr><trid="section-99"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-99">#</a></div><h2>Setup the OOP Wrapper</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-100"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-100">#</a></div><p>If Underscore is called as a function, it returns a wrapped object that
underscore functions. Wrapped objects may be chained.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">wrapper = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="k">this</span></pre></div></td></tr><trid="section-101"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-101">#</a></div><p>Helper function to continue chaining intermediate results.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">result = </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">chain</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="k">if</span><spanclass="nx">chain</span><spanclass="k">then</span><spanclass="nx">_</span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">).</span><spanclass="nx">chain</span><spanclass="p">()</span><spanclass="k">else</span><spanclass="nx">obj</span></pre></div></td></tr><trid="section-102"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-102">#</a></div><p>A method to easily add functions to the OOP wrapper.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">addToWrapper = </span><spanclass="p">(</span><spanclass="nx">name</span><spanclass="p">,</span><spanclass="nx">func</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">result</span><spanclass="nx">func</span><spanclass="p">.</span><spanclass="nx">apply</span><spanclass="p">(</span><spanclass="nx">_</span><spanclass="p">,</span><spanclass="nx">args</span><spanclass="p">),</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">_chain</span></pre></div></td></tr><trid="section-103"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-103">#</a></div><p>Add all of the Underscore functions to the wrapper object.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">mixin</span><spanclass="nx">_</span></pre></div></td></tr><trid="section-104"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-104">#</a></div><p>Add all mutator Array functions to the wrapper.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">each</span><spanclass="p">[</span><spanclass="s1">'pop'</span><spanclass="p">,</span><spanclass="s1">'push'</span><spanclass="p">,</span><spanclass="s1">'reverse'</span><spanclass="p">,</span><spanclass="s1">'shift'</span><spanclass="p">,</span><spanclass="s1">'sort'</span><spanclass="p">,</span><spanclass="s1">'splice'</span><spanclass="p">,</span><spanclass="s1">'unshift'</span><spanclass="p">],</span><spanclass="p">(</span><spanclass="nx">name</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">result</span><spanclass="p">(</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">_wrapped</span><spanclass="p">,</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">_chain</span><spanclass="p">)</span></pre></div></td></tr><trid="section-105"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-105">#</a></div><p>Add all accessor Array functions to the wrapper.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">each</span><spanclass="p">[</span><spanclass="s1">'concat'</span><spanclass="p">,</span><spanclass="s1">'join'</span><spanclass="p">,</span><spanclass="s1">'slice'</span><spanclass="p">],</span><spanclass="p">(</span><spanclass="nx">name</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="k">this</span></pre></div></td></tr><trid="section-107"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-107">#</a></div><p>Extracts the result from a wrapped and chained object.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">wrapper::value = </span><spanclass="o">-></span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">_wrapped</span>