replacing all isType tests that relied on string comparisons with versions that check for existence of known methods and properties. Less safe, but more than an order of magnitude faster.

This commit is contained in:
Jeremy Ashkenas
2010-01-01 19:05:34 -05:00
parent d49196f2e7
commit 4be6a194cd
3 changed files with 81 additions and 17 deletions

25
test/temp.js Normal file
View File

@@ -0,0 +1,25 @@
(function() {
var func = function(){};
var date = new Date();
var str = "a string";
var numbers = [];
for (var i=0; i<1000; i++) numbers.push(i);
var objects = _.map(numbers, function(n){ return {num : n}; });
var randomized = _.sortBy(numbers, function(){ return Math.random(); });
JSLitmus.test('_.each()', function() {
var timesTwo = [];
_.each(numbers, function(num){ timesTwo.push(num * 2); });
return timesTwo;
});
JSLitmus.test('_.isString', function() {
return _.isString(str);
});
JSLitmus.test('_.isStringNew', function() {
return _.isStringNew(str);
});
})();

19
test/temp_tests.html Normal file
View File

@@ -0,0 +1,19 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Underscore Temporary Tests</title>
<link rel="stylesheet" href="vendor/qunit.css" type="text/css" media="screen" />
<script type="text/javascript" src="vendor/jquery.js"></script>
<script type="text/javascript" src="vendor/jslitmus.js"></script>
<script type="text/javascript" src="../underscore.js"></script>
<script type="text/javascript" src="temp.js"></script>
</head>
<body>
<h1 class="qunit-header">Underscore Temporary Tests</h1>
<h2 class="qunit-userAgent">
A page for temporary speed tests, used for developing faster implementations
of existing Underscore methods.
</h2>
<br />
</body>
</html>

View File

@@ -428,6 +428,13 @@
return _.extend({}, obj);
};
// 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.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
// Check object identity.
@@ -474,11 +481,41 @@
return !!(obj && obj.nodeType == 1);
};
// Is a given value an array?
_.isArray = function(obj) {
return obj && obj.concat && obj.unshift;
};
// Is a given variable an arguments object?
_.isArguments = function(obj) {
return obj && _.isNumber(obj.length) && !_.isArray(obj) && !propertyIsEnumerable.call(obj, 'length');
};
// Is a given value a function?
_.isFunction = function(obj) {
return obj && obj.constructor && obj.call && obj.apply;
};
// Is a given value a string?
_.isString = function(obj) {
return obj === '' || (obj && obj.charCodeAt && obj.substr);
};
// Is a given value a number?
_.isNumber = function(obj) {
return toString.call(obj) === '[object Number]';
};
// Is a given value a date?
_.isDate = function(obj) {
return obj && obj.getTimezoneOffset && obj.setUTCFullYear;
};
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false);
};
// Is the given value NaN -- this one is interesting. NaN != NaN, and
// isNaN(undefined) == true, so we make sure it's a number first.
_.isNaN = function(obj) {
@@ -495,23 +532,6 @@
return typeof obj == 'undefined';
};
// 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.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
}
// Define the isArray, isDate, isFunction, isNumber, isRegExp, and isString
// functions based on their toString identifiers.
var types = ['Array', 'Date', 'Function', 'Number', 'RegExp', 'String'];
for (var i=0, l=types.length; i<l; i++) {
(function() {
var identifier = '[object ' + types[i] + ']';
_['is' + types[i]] = function(obj) { return toString.call(obj) == identifier; };
})();
}
/* -------------------------- Utility Functions: -------------------------- */
// Run Underscore.js in noConflict mode, returning the '_' variable to its