mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-15 13:17:50 +00:00
Update vendor/backbone and vendor/underscore.
This commit is contained in:
97
vendor/underscore/underscore.js
vendored
97
vendor/underscore/underscore.js
vendored
@@ -11,8 +11,8 @@
|
||||
// Establish the root object, `window` (`self`) in the browser, `global`
|
||||
// on the server, or `this` in some virtual machines. We use `self`
|
||||
// instead of `window` for `WebWorker` support.
|
||||
var root = typeof self === 'object' && self.self === self && self ||
|
||||
typeof global === 'object' && global.global === global && global ||
|
||||
var root = typeof self == 'object' && self.self === self && self ||
|
||||
typeof global == 'object' && global.global === global && global ||
|
||||
this;
|
||||
|
||||
// Save the previous value of the `_` variable.
|
||||
@@ -48,8 +48,10 @@
|
||||
// Export the Underscore object for **Node.js**, with
|
||||
// backwards-compatibility for their old module API. If we're in
|
||||
// the browser, add `_` as a global object.
|
||||
if (typeof exports !== 'undefined') {
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
// (`nodeType` is checked to ensure that `module`
|
||||
// and `exports` are not HTML elements.)
|
||||
if (typeof exports != 'undefined' && !exports.nodeType) {
|
||||
if (typeof module != 'undefined' && !module.nodeType && module.exports) {
|
||||
exports = module.exports = _;
|
||||
}
|
||||
exports._ = _;
|
||||
@@ -83,15 +85,17 @@
|
||||
};
|
||||
};
|
||||
|
||||
// A mostly-internal function to generate callbacks that can be applied
|
||||
// to each element in a collection, returning the desired result — either
|
||||
// identity, an arbitrary callback, a property matcher, or a property accessor.
|
||||
// An internal function to generate callbacks that can be applied to each
|
||||
// element in a collection, returning the desired result — either `identity`,
|
||||
// an arbitrary callback, a property matcher, or a property accessor.
|
||||
var cb = function(value, context, argCount) {
|
||||
if (value == null) return _.identity;
|
||||
if (_.isFunction(value)) return optimizeCb(value, context, argCount);
|
||||
if (_.isObject(value)) return _.matcher(value);
|
||||
return _.property(value);
|
||||
};
|
||||
|
||||
// An external wrapper for the internal callback generator
|
||||
_.iteratee = function(value, context) {
|
||||
return cb(value, context, Infinity);
|
||||
};
|
||||
@@ -137,7 +141,7 @@
|
||||
};
|
||||
|
||||
// Helper for collection methods to determine whether a collection
|
||||
// should be iterated as an array or as an object
|
||||
// should be iterated as an array or as an object.
|
||||
// Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
|
||||
// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
|
||||
var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
|
||||
@@ -184,8 +188,8 @@
|
||||
|
||||
// Create a reducing function iterating left or right.
|
||||
var createReduce = function(dir) {
|
||||
// Optimized iterator function as using arguments.length
|
||||
// in the main function will deoptimize the, see #1991.
|
||||
// Wrap code that reassigns argument variables in a separate function than
|
||||
// the one that accesses `arguments.length` to avoid a perf hit. (#1191)
|
||||
var reducer = function(obj, iteratee, memo, initial) {
|
||||
var keys = !isArrayLike(obj) && _.keys(obj),
|
||||
length = (keys || obj).length,
|
||||
@@ -309,7 +313,7 @@
|
||||
obj = isArrayLike(obj) ? obj : _.values(obj);
|
||||
for (var i = 0, length = obj.length; i < length; i++) {
|
||||
value = obj[i];
|
||||
if (value > result) {
|
||||
if (value != null && value > result) {
|
||||
result = value;
|
||||
}
|
||||
}
|
||||
@@ -334,7 +338,7 @@
|
||||
obj = isArrayLike(obj) ? obj : _.values(obj);
|
||||
for (var i = 0, length = obj.length; i < length; i++) {
|
||||
value = obj[i];
|
||||
if (value < result) {
|
||||
if (value != null && value < result) {
|
||||
result = value;
|
||||
}
|
||||
}
|
||||
@@ -431,10 +435,15 @@
|
||||
if (_.has(result, key)) result[key]++; else result[key] = 1;
|
||||
});
|
||||
|
||||
var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
|
||||
// Safely create a real, live array from anything iterable.
|
||||
_.toArray = function(obj) {
|
||||
if (!obj) return [];
|
||||
if (_.isArray(obj)) return slice.call(obj);
|
||||
if (_.isString(obj)) {
|
||||
// Keep surrogate pair characters together
|
||||
return obj.match(reStrSymbol);
|
||||
}
|
||||
if (isArrayLike(obj)) return _.map(obj, _.identity);
|
||||
return _.values(obj);
|
||||
};
|
||||
@@ -497,7 +506,7 @@
|
||||
for (var i = 0, length = getLength(input); i < length; i++) {
|
||||
var value = input[i];
|
||||
if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
|
||||
//flatten current level of array or arguments object
|
||||
// Flatten current level of array or arguments object
|
||||
if (shallow) {
|
||||
var j = 0, len = value.length;
|
||||
while (j < len) output[idx++] = value[j++];
|
||||
@@ -685,7 +694,9 @@
|
||||
stop = start || 0;
|
||||
start = 0;
|
||||
}
|
||||
step = step || 1;
|
||||
if (!step) {
|
||||
step = stop < start ? -1 : 1;
|
||||
}
|
||||
|
||||
var length = Math.max(Math.ceil((stop - start) / step), 0);
|
||||
var range = Array(length);
|
||||
@@ -782,7 +793,7 @@
|
||||
// Delays a function for the given number of milliseconds, and then calls
|
||||
// it with the arguments supplied.
|
||||
_.delay = restArgs(function(func, wait, args) {
|
||||
return setTimeout(function(){
|
||||
return setTimeout(function() {
|
||||
return func.apply(null, args);
|
||||
}, wait);
|
||||
});
|
||||
@@ -797,17 +808,18 @@
|
||||
// but if you'd like to disable the execution on the leading edge, pass
|
||||
// `{leading: false}`. To disable execution on the trailing edge, ditto.
|
||||
_.throttle = function(func, wait, options) {
|
||||
var context, args, result;
|
||||
var timeout = null;
|
||||
var timeout, context, args, result;
|
||||
var previous = 0;
|
||||
if (!options) options = {};
|
||||
|
||||
var later = function() {
|
||||
previous = options.leading === false ? 0 : _.now();
|
||||
timeout = null;
|
||||
result = func.apply(context, args);
|
||||
if (!timeout) context = args = null;
|
||||
};
|
||||
return function() {
|
||||
|
||||
var throttled = function() {
|
||||
var now = _.now();
|
||||
if (!previous && options.leading === false) previous = now;
|
||||
var remaining = wait - (now - previous);
|
||||
@@ -826,6 +838,14 @@
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
throttled.cancel = function() {
|
||||
clearTimeout(timeout);
|
||||
previous = 0;
|
||||
timeout = context = args = null;
|
||||
};
|
||||
|
||||
return throttled;
|
||||
};
|
||||
|
||||
// Returns a function, that, as long as it continues to be invoked, will not
|
||||
@@ -833,35 +853,32 @@
|
||||
// N milliseconds. If `immediate` is passed, trigger the function on the
|
||||
// leading edge, instead of the trailing.
|
||||
_.debounce = function(func, wait, immediate) {
|
||||
var timeout, args, context, timestamp, result;
|
||||
var timeout, result;
|
||||
|
||||
var later = function() {
|
||||
var last = _.now() - timestamp;
|
||||
|
||||
if (last < wait && last >= 0) {
|
||||
timeout = setTimeout(later, wait - last);
|
||||
} else {
|
||||
timeout = null;
|
||||
if (!immediate) {
|
||||
result = func.apply(context, args);
|
||||
if (!timeout) context = args = null;
|
||||
}
|
||||
}
|
||||
var later = function(context, args) {
|
||||
timeout = null;
|
||||
if (args) result = func.apply(context, args);
|
||||
};
|
||||
|
||||
return function() {
|
||||
context = this;
|
||||
args = arguments;
|
||||
timestamp = _.now();
|
||||
var debounced = restArgs(function(args) {
|
||||
var callNow = immediate && !timeout;
|
||||
if (!timeout) timeout = setTimeout(later, wait);
|
||||
if (timeout) clearTimeout(timeout);
|
||||
if (callNow) {
|
||||
result = func.apply(context, args);
|
||||
context = args = null;
|
||||
timeout = setTimeout(later, wait);
|
||||
result = func.apply(this, args);
|
||||
} else if (!immediate) {
|
||||
timeout = _.delay(later, wait, this, args);
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
debounced.cancel = function() {
|
||||
clearTimeout(timeout);
|
||||
timeout = null;
|
||||
};
|
||||
|
||||
return debounced;
|
||||
};
|
||||
|
||||
// Returns the first function passed as an argument to the second,
|
||||
@@ -1148,7 +1165,7 @@
|
||||
if (a !== a) return b !== b;
|
||||
// Exhaust primitive checks
|
||||
var type = typeof a;
|
||||
if (type !== 'function' && type !== 'object' && typeof b !== 'object') return false;
|
||||
if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
|
||||
return deepEq(a, b, aStack, bStack);
|
||||
};
|
||||
|
||||
@@ -1598,7 +1615,7 @@
|
||||
// popular enough to be bundled in a third party lib, but not be part of
|
||||
// an AMD load request. Those cases could generate an error when an
|
||||
// anonymous define() is called outside of a loader request.
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
if (typeof define == 'function' && define.amd) {
|
||||
define('underscore', [], function() {
|
||||
return _;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user