From a5873a3158b94322c9457acaa0a18b579816e7da Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Mon, 11 Jun 2012 22:49:24 -0400 Subject: [PATCH] Add comments, documentation, and update the minified build. Former-commit-id: c65665063f254b1ba9dab9c6948fedf29f1e795f --- doc/README.md | 54 +++++++++++++++++++++++++-------------------------- lodash.js | 12 ++++++++++-- lodash.min.js | 38 ++++++++++++++++++------------------ 3 files changed, 56 insertions(+), 48 deletions(-) diff --git a/doc/README.md b/doc/README.md index c5c448089..291dc5bce 100644 --- a/doc/README.md +++ b/doc/README.md @@ -147,7 +147,7 @@ The `lodash` function. ### `_.VERSION` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3344 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3352 "View in source") [Ⓣ][1] *(String)*: The semantic version number. @@ -270,7 +270,7 @@ jQuery('#lodash_button').on('click', buttonView.onClick); ### `_.chain(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3296 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3304 "View in source") [Ⓣ][1] Wraps the value in a `lodash` chainable object. @@ -533,7 +533,7 @@ _.difference([1, 2, 3, 4, 5], [5, 2, 10]); ### `_.escape(string)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2987 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2992 "View in source") [Ⓣ][1] Escapes a string for inclusion in HTML, replacing `&`, `<`, `"`, and `'` characters. @@ -888,7 +888,7 @@ _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b'); ### `_.identity(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3006 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3011 "View in source") [Ⓣ][1] This function returns the first argument passed to it. Note: It is used throughout Lo-Dash as a default callback. @@ -1209,7 +1209,7 @@ _.isEqual(moe, clone); ### `_.isFinite(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2684 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2689 "View in source") [Ⓣ][1] Checks if a `value` is a finite number. @@ -1239,7 +1239,7 @@ _.isFinite(Infinity); ### `_.isFunction(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2701 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2706 "View in source") [Ⓣ][1] Checks if a `value` is a function. @@ -1263,7 +1263,7 @@ _.isFunction(''.concat); ### `_.isNaN(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2752 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2757 "View in source") [Ⓣ][1] Checks if a `value` is `NaN`. Note: This is not the same as native `isNaN`, which will return true for `undefined` and other values. See http://es5.github.com/#x15.1.2.4. @@ -1296,7 +1296,7 @@ _.isNaN(undefined); ### `_.isNull(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2774 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2779 "View in source") [Ⓣ][1] Checks if a `value` is `null`. @@ -1323,7 +1323,7 @@ _.isNull(undefined); ### `_.isNumber(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2791 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2796 "View in source") [Ⓣ][1] Checks if a `value` is a number. @@ -1347,7 +1347,7 @@ _.isNumber(8.4 * 5; ### `_.isObject(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2722 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2727 "View in source") [Ⓣ][1] Checks if a `value` is the language type of Object. *(e.g. arrays, functions, objects, regexps, `new Number(0)*`, and `new String('')`) @@ -1374,7 +1374,7 @@ _.isObject(1); ### `_.isRegExp(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2808 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2813 "View in source") [Ⓣ][1] Checks if a `value` is a regular expression. @@ -1398,7 +1398,7 @@ _.isRegExp(/moe/); ### `_.isString(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2825 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2830 "View in source") [Ⓣ][1] Checks if a `value` is a string. @@ -1422,7 +1422,7 @@ _.isString('moe'); ### `_.isUndefined(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2842 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2847 "View in source") [Ⓣ][1] Checks if a `value` is `undefined`. @@ -1446,7 +1446,7 @@ _.isUndefined(void 0); ### `_.keys(object)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2859 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2864 "View in source") [Ⓣ][1] Produces an array of object`'s own enumerable property names. @@ -1638,7 +1638,7 @@ _.min([10, 5, 100, 2, 1000]); ### `_.mixin(object)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3032 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3037 "View in source") [Ⓣ][1] Adds functions properties of `object` to the `lodash` function and chainable wrapper. @@ -1668,7 +1668,7 @@ _('larry').capitalize(); ### `_.noConflict()` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3063 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3068 "View in source") [Ⓣ][1] Reverts the '_' variable to its previous value and returns a reference to the `lodash` function. @@ -1741,7 +1741,7 @@ hi('moe'); ### `_.pick(object [, prop1, prop2, ...])` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2881 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2886 "View in source") [Ⓣ][1] Creates an object composed of the specified properties. Property names may be specified as individual arguments or as arrays of property names. @@ -1942,9 +1942,9 @@ _.rest([3, 2, 1]); ### `_.result(object, property)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3093 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3099 "View in source") [Ⓣ][1] -Resolves the value of `property` on `object`. If `property` is a function it will be invoked and its result returned, else the property value is returned. +Resolves the value of `property` on `object`. If `property` is a function it will be invoked and its result returned, else the property value is returned. If `object` is falsey, then `null` is returned. #### Arguments 1. `object` *(Object)*: The object to inspect. @@ -2001,7 +2001,7 @@ _.shuffle([1, 2, 3, 4, 5, 6]); ### `_.size(value)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2919 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2924 "View in source") [Ⓣ][1] Gets the size of `value` by returning `value.length` if `value` is a string or array, or the number of own enumerable properties if `value` is an object. @@ -2130,7 +2130,7 @@ _.sortedIndex(['twenty', 'thirty', 'fourty'], 'thirty-five', function(word) { ### `_.tap(value, interceptor)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2947 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2952 "View in source") [Ⓣ][1] Invokes `interceptor` with the `value` as the first argument, and then returns `value`. The primary purpose of this method is to "tap into" a method chain, in order to performoperations on intermediate results within the chain. @@ -2160,7 +2160,7 @@ _.chain([1,2,3,200]) ### `_.template(text, data, options)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3152 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3160 "View in source") [Ⓣ][1] A micro-templating method, similar to John Resig's implementation. Lo-Dash templating handles arbitrary delimiters, preserves whitespace, and correctly escapes quotes within interpolated code. @@ -2244,7 +2244,7 @@ jQuery(window).on('scroll', throttled); ### `_.times(n, callback [, thisArg])` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3239 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3247 "View in source") [Ⓣ][1] Executes the `callback` function `n` times. The `callback` is bound to `thisArg` and invoked with `1` argument; *(index)*. @@ -2354,7 +2354,7 @@ _.uniq([1, 2, 1.5, 3, 2.5], function(num) { return this.floor(num); }, Math); ### `_.uniqueId([prefix])` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3266 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3274 "View in source") [Ⓣ][1] Generates a unique id. If `prefix` is passed, the id will be appended to it. @@ -2378,7 +2378,7 @@ _.uniqueId('contact_'); ### `_.values(object)` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2965 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L2970 "View in source") [Ⓣ][1] Produces an array of `object`'s own enumerable property values. @@ -2488,7 +2488,7 @@ _.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]); ### `_.prototype.chain()` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3314 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3322 "View in source") [Ⓣ][1] Extracts the value from a wrapped chainable object. @@ -2509,7 +2509,7 @@ _([1, 2, 3]).value(); ### `_.prototype.value()` -# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3331 "View in source") [Ⓣ][1] +# [Ⓢ](https://github.com/bestiejs/lodash/blob/v0.3.1/lodash.js#L3339 "View in source") [Ⓣ][1] Extracts the value from a wrapped chainable object. diff --git a/lodash.js b/lodash.js index 081e8b0f4..663539899 100644 --- a/lodash.js +++ b/lodash.js @@ -2641,7 +2641,12 @@ // ensure both objects have the same number of properties if (result) { for (prop in b) { - if (hasOwnProperty.call(b, prop) && !(size--)) break; + // Adobe JS engines have an operator precedence bug that causes `!size--` + // to produce the wrong result so it must be wrapped in parentheses. + // https://github.com/documentcloud/underscore/issues/355 + if (hasOwnProperty.call(b, prop) && !(size--)) { + break; + } } result = !size; } @@ -3067,7 +3072,8 @@ /** * Resolves the value of `property` on `object`. If `property` is a function - * it will be invoked and its result returned, else the property value is returned. + * it will be invoked and its result returned, else the property value is + * returned. If `object` is falsey, then `null` is returned. * * @static * @memberOf _ @@ -3091,6 +3097,8 @@ * // => 'nonsense' */ function result(object, property) { + // based on Backbone's private `getValue` function + // https://github.com/documentcloud/backbone/blob/0.9.2/backbone.js#L1419-1424 if (!object) { return null; } diff --git a/lodash.min.js b/lodash.min.js index 3f7362284..9661393de 100644 --- a/lodash.min.js +++ b/lodash.min.js @@ -3,30 +3,30 @@ Underscore.js 1.3.3 github.com/documentcloud/underscore/blob/master/LICENSE */ ;(function(e,t){"use strict";function s(e){return"[object Arguments]"==rt.call(e)}function o(e){return new u(e)}function u(e){if(e&&e._wrapped)return e;this._wrapped=e}function a(){for(var e,t,s,o=-1,u=arguments.length,a={e:"",f:"",k:"",q:"",c:{d:"",m:"++k/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,variable:"obj"};var lt=Function("obj","var __p;with(obj){__p='var k,r';if(k){__p+='='+k};__p+=';'+f+';'+q+';';if(c){__p+='var m='+g+'.length;k=-1;';if(o){__p+='if(m===m>>>0){'};__p+=''+c['d']+';while('+c['m']+'){'+c['j']+'}';if(o){__p+='}'}}if(o){if(c){__p+='else{'}if(!i){__p+='var s=typeof '+l+'==\\'function\\';'};__p+=''+o['d']+';for('+o['m']+'){';if(i){if(r){__p+='if('+h+'){'};__p+=''+o['j']+';';if(r){__p+='}'}}else{__p+='if(!(s&&k==\\'prototype\\')';if(r){__p+='&&'+h};__p+='){'+o['j']+'}'};__p+='}';if(i){__p+='var f='+l+'.constructor;';for(var k=0;k<7;k++){__p+='k=\\''+p[k]+'\\';if(';if(p[k]=='constructor'){__p+='!(f&&f.prototype==='+l+')&&'};__p+=''+h+'){'+o['j']+'}'}}if(c){__p+='}'}};__p+=''+e+';return r'}return __p" ),ct={a:"e,c,x",k:"e",q:"if(!c){c=j}else if(x){c=l(c,x)}",j:"c(e[k],k,e)"},ht={k:"z",j:"if(!c(e[k],k,e))return!r"},pt={a:"n",k:"n",q:"for(var t,u=1,m=arguments.length;ue?t():function(){if(1>--e)return t.apply(this,arguments)}},o.bind=C,o.bindAll=function(e){var t=arguments,n=1;1==t.length&&(n=0,t=Nt(e));for( var r=t.length;nw(i,e[n])&&t.push(e[n]);return t},o.escape=function(e){return(e+"").replace(B,c)},o.every=yt,o.extend=Tt -,o.filter=Y,o.find=bt,o.first=y,o.flatten=b,o.forEach=wt,o.forIn=pt,o.forOwn=ct,o.functions=Nt,o.groupBy=function(e,t,n){var r={};if(!e)return r;var i,s=-1,o="function"==typeof t,u=e.length;for(o&&n&&(t=h(t,n));++sw(t,n)&&yt(s,function(e){return-1n?Math.max(0,r+n):Math.min(n,r-1))+1);r--;)if(e[r]===t)return r;return-1},o.map=Et,o.max=E,o.memoize=function(e,t){var n={};return function(){var r=t?t.apply(this,arguments):arguments[0];return et.call(n,r)?n[r]:n[r]=e.apply(this,arguments)}},o.min=function(e,t,n){var r=Infinity,i=r;if(!e)return i;var s=-1,o=e.length;if(!t){for(;++s -arguments.length&&(t=e||0,e=0);for(var r=-1,i=Math.max(Math.ceil((t-e)/n),0),s=Array(i);++ri?1:0});s--;)o[s]=o[s].b;return o},o.sortedIndex=T,o.tap=function(e,t){return t(e),e},o.template=function(e,t,n){n||(n={});var i;i=o.templateSettings;var s=n.escape,u=n.evaluate,a=n.interpolate,n=n.variable;return s==r&&(s=i.escape),u==r&&(u=i.evaluate),a==r&&(a=i -.interpolate),s&&(e=e.replace(s,d)),a&&(e=e.replace(a,v)),u&&(e=e.replace(u,m)),e="__p='"+e.replace(j,l).replace(H,f)+"';",q.length=0,n||(n=i.variable,e="with("+n+"||{}){"+e+"}"),e="function("+n+"){var __p,__t,__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+e+"return __p}",i=Function("_","return "+e)(o),t?i(t):(i.source=e,i)},o.throttle=function(e,n){function r(){a=new Date,u=t,e.apply(o,i)}var i,s,o,u,a=0;return function(){var t=new Date,f=n-(t-a);return i=arguments,o=this -,0>=f?(a=t,s=e.apply(o,i)):u||(u=ft(r,f)),s}},o.times=function(e,t,n){var r=-1;if(n)for(;++r>>0?nt.call(e):Lt(e)},o.union=function(){for(var e=-1,t=[],n=Z.apply(t,arguments),r=n.length;++ew(t,n[e])&&t.push(n[e]);return t},o.uniq=N,o.uniqueId=function(e){var t=_++;return e?e+t:t},o.values=Lt,o.without=function(e){var t=[];if(!e)return t;for(var n= +){var t=r&&!a;return s=arguments,u=this,at(a),a=ft(i,n),t&&(o=e.apply(u,s)),o}},o.defaults=xt,o.defer=function(e){var n=nt.call(arguments,1);return ft(function(){return e.apply(t,n)},1)},o.delay=function(e,n){var r=nt.call(arguments,2);return ft(function(){return e.apply(t,r)},n)},o.difference=function(e){var t=[];if(!e)return t;for(var n=-1,r=e.length,i=Z.apply(t,nt.call(arguments,1));++nw(i,e[n])&&t.push(e[n]);return t},o.escape=function(e){return e==r?"":(e+"").replace(B,c)},o.every=yt,o +.extend=Tt,o.filter=Y,o.find=bt,o.first=y,o.flatten=b,o.forEach=wt,o.forIn=pt,o.forOwn=ct,o.functions=Nt,o.groupBy=function(e,t,n){var r={};if(!e)return r;var i,s=-1,o="function"==typeof t,u=e.length;for(o&&n&&(t=h(t,n));++sw(t,n)&&yt(s,function(e){return-1n?Math.max(0,r+n):Math.min(n,r-1))+1);r--;)if(e[r]===t)return r;return-1},o.map=Et,o.max=E,o.memoize=function(e,t){var n={};return function(){var r=t?t.apply(this,arguments):arguments[0];return et.call(n,r)?n[r]:n[r]=e.apply(this,arguments)}},o.min=function(e,t,n){var r=Infinity,i=r;if(!e)return i;var s=-1,o=e.length;if(!t){for(;++sarguments.length&&(t=e||0,e=0);for(var r=-1,i=Math.max(Math.ceil((t-e)/n),0),s=Array(i);++ri?1:0});s--;)o[s]=o[s].b;return o},o.sortedIndex=T,o.tap=function(e,t){return t(e),e},o.template=function(e,t,n){n||(n={});var i;i=o.templateSettings;var s=n.escape,u=n.evaluate,a=n.interpolate,n=n.variable;return s==r&&(s=i.escape),u==r&&(u=i.evaluate),a==r&& +(a=i.interpolate),s&&(e=e.replace(s,d)),a&&(e=e.replace(a,v)),u&&(e=e.replace(u,m)),e="__p='"+e.replace(j,l).replace(H,f)+"';",q.length=0,n||(n=i.variable,e="with("+n+"||{}){"+e+"}"),e="function("+n+"){var __p,__t,__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+e+"return __p}",i=Function("_","return "+e)(o),t?i(t):(i.source=e,i)},o.throttle=function(e,n){function r(){a=new Date,u=t,e.apply(o,i)}var i,s,o,u,a=0;return function(){var t=new Date,f=n-(t-a);return i=arguments,o= +this,0>=f?(a=t,s=e.apply(o,i)):u||(u=ft(r,f)),s}},o.times=function(e,t,n){var r=-1;if(n)for(;++r>>0?nt.call(e):Lt(e)},o.union=function(){for(var e=-1,t=[],n=Z.apply(t,arguments),r=n.length;++ew(t,n[e])&&t.push(n[e]);return t},o.uniq=N,o.uniqueId=function(e){var t=_++;return e?e+t:t},o.values=Lt,o.without=function(e){var t=[];if(!e)return t;for(var n= nt.call(arguments,1),r=-1,i=e.length;++rw(n,e[r])&&t.push(e[r]);return t},o.wrap=function(e,t){return function(){var n=[e];return arguments.length&&tt.apply(n,arguments),t.apply(this,n)}},o.zip=function(e){if(!e)return[];for(var t=-1,n=E(S(arguments,"length")),r=Array(n);++t