underscore-source 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  module Underscore
2
2
  module Source
3
- VERSION = "0.4.6"
3
+ VERSION = "0.4.7"
4
4
  end
5
5
  end
@@ -30,8 +30,11 @@
30
30
  // Export the Underscore object for CommonJS.
31
31
  if (typeof exports !== 'undefined') exports._ = _;
32
32
 
33
+ // Maintain a reference to the Object prototype for quick access.
34
+ var objPro = Object.prototype;
35
+
33
36
  // Current version.
34
- _.VERSION = '0.4.6';
37
+ _.VERSION = '0.4.7';
35
38
 
36
39
  /*------------------------ Collection Functions: ---------------------------*/
37
40
 
@@ -43,11 +46,10 @@
43
46
  if (obj.forEach) {
44
47
  obj.forEach(iterator, context);
45
48
  } else if (obj.length) {
46
- for (var i=0, l = obj.length; i<l; i++) iterator.call(context, obj[i], i, obj);
49
+ for (var i=0, l=obj.length; i<l; i++) iterator.call(context, obj[i], i, obj);
47
50
  } else {
48
- for (var key in obj) if (Object.prototype.hasOwnProperty.call(obj, key)) {
49
- iterator.call(context, obj[key], key, obj);
50
- }
51
+ var keys = _.keys(obj), l = keys.length;
52
+ for (var i=0; i<l; i++) iterator.call(context, obj[keys[i]], keys[i], obj);
51
53
  }
52
54
  } catch(e) {
53
55
  if (e != breaker) throw e;
@@ -379,10 +381,11 @@
379
381
  _.compose = function() {
380
382
  var funcs = _.toArray(arguments);
381
383
  return function() {
384
+ var args = _.toArray(arguments);
382
385
  for (var i=funcs.length-1; i >= 0; i--) {
383
- arguments = [funcs[i].apply(this, arguments)];
386
+ args = [funcs[i].apply(this, args)];
384
387
  }
385
- return arguments[0];
388
+ return args[0];
386
389
  };
387
390
  };
388
391
 
@@ -390,7 +393,10 @@
390
393
 
391
394
  // Retrieve the names of an object's properties.
392
395
  _.keys = function(obj) {
393
- return _.map(obj, function(value, key){ return key; });
396
+ if(_.isArray(obj)) return _.range(0, obj.length);
397
+ var keys = [];
398
+ for (var key in obj) if (objPro.hasOwnProperty.call(obj, key)) keys.push(key);
399
+ return keys;
394
400
  };
395
401
 
396
402
  // Retrieve the values of an object's properties.
@@ -419,12 +425,16 @@
419
425
  if (atype != btype) return false;
420
426
  // Basic equality test (watch out for coercions).
421
427
  if (a == b) return true;
428
+ // Check dates' integer values.
429
+ if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime();
422
430
  // One of them implements an isEqual()?
423
431
  if (a.isEqual) return a.isEqual(b);
424
432
  // Both are NaN?
425
- if (_.isNumber(a) && _.isNumber(b) && isNaN(a) && isNaN(b)) return true;
433
+ if (_.isNaN(a) && _.isNaN(b)) return true;
426
434
  // If a is not an object by this point, we can't handle it.
427
435
  if (atype !== 'object') return false;
436
+ // Check for different array lengths before comparing contents.
437
+ if (!_.isUndefined(a.length) && a.length !== b.length) return false;
428
438
  // Nothing else worked, deep compare the contents.
429
439
  var aKeys = _.keys(a), bKeys = _.keys(b);
430
440
  // Different object sizes?
@@ -436,7 +446,7 @@
436
446
 
437
447
  // Is a given array or object empty?
438
448
  _.isEmpty = function(obj) {
439
- return (_.isArray(obj) ? obj : _.values(obj)).length == 0;
449
+ return _.keys(obj).length == 0;
440
450
  };
441
451
 
442
452
  // Is a given value a DOM element?
@@ -446,22 +456,38 @@
446
456
 
447
457
  // Is a given value a real Array?
448
458
  _.isArray = function(obj) {
449
- return Object.prototype.toString.call(obj) == '[object Array]';
459
+ return objPro.toString.call(obj) == '[object Array]';
450
460
  };
451
461
 
452
462
  // Is a given value a Function?
453
463
  _.isFunction = function(obj) {
454
- return Object.prototype.toString.call(obj) == '[object Function]';
464
+ return objPro.toString.call(obj) == '[object Function]';
455
465
  };
456
466
 
457
467
  // Is a given value a String?
458
468
  _.isString = function(obj) {
459
- return Object.prototype.toString.call(obj) == '[object String]';
469
+ return objPro.toString.call(obj) == '[object String]';
460
470
  };
461
471
 
462
472
  // Is a given value a Number?
463
473
  _.isNumber = function(obj) {
464
- return Object.prototype.toString.call(obj) == '[object Number]';
474
+ return objPro.toString.call(obj) == '[object Number]';
475
+ };
476
+
477
+ // Is a given value a Date?
478
+ _.isDate = function(obj) {
479
+ return objPro.toString.call(obj) == '[object Date]';
480
+ };
481
+
482
+ // Is the given value NaN -- this one is interesting. NaN != NaN, and
483
+ // isNaN(undefined) == true, so we make sure it's a number first.
484
+ _.isNaN = function(obj) {
485
+ return _.isNumber(obj) && isNaN(obj);
486
+ };
487
+
488
+ // Is a given value equal to null?
489
+ _.isNull = function(obj) {
490
+ return obj === null;
465
491
  };
466
492
 
467
493
  // Is a given variable undefined?
@@ -498,9 +524,7 @@
498
524
 
499
525
  // Return a sorted list of the function names available in Underscore.
500
526
  _.functions = function() {
501
- var functions = [];
502
- for (var key in _) if (Object.prototype.hasOwnProperty.call(_, key)) functions.push(key);
503
- return _.without(functions, 'VERSION', 'prototype', 'noConflict').sort();
527
+ return _.without(_.keys(_), 'VERSION', 'prototype', 'noConflict').sort();
504
528
  };
505
529
 
506
530
  // JavaScript templating a-la ERB, pilfered from John Resig's
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: underscore-source
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.4.6
5
+ version: 0.4.7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel X. Moore