@@ -500,13 +500,23 @@ Array.from = $A;
500
500
} ;
501
501
}
502
502
503
+ // Note that #map, #filter, #some, and #every take some extra steps for
504
+ // ES5 compliance: the context in which they're called is coerced to an
505
+ // object, and that object's `length` property is coerced to a finite
506
+ // integer. This makes it easier to use the methods as generics.
507
+ //
508
+ // This means that they behave a little differently from other methods in
509
+ // `Enumerable`/`Array` that don't collide with ES5, but that's OK.
503
510
function map ( iterator ) {
511
+ if ( this == null ) throw new TypeError ( ) ;
504
512
iterator = iterator || Prototype . K ;
513
+
514
+ var object = Object ( this ) ;
505
515
var results = [ ] , context = arguments [ 1 ] , n = 0 ;
506
516
507
- for ( var i = 0 , length = this . length ; i < length ; i ++ ) {
508
- if ( i in this ) {
509
- results [ n ] = iterator . call ( context , this [ i ] , i , this ) ;
517
+ for ( var i = 0 , length = object . length >>> 0 ; i < length ; i ++ ) {
518
+ if ( i in object ) {
519
+ results [ n ] = iterator . call ( context , object [ i ] , i , object ) ;
510
520
}
511
521
n ++ ;
512
522
}
@@ -519,14 +529,16 @@ Array.from = $A;
519
529
}
520
530
521
531
function filter ( iterator ) {
522
- if ( ! Object . isFunction ( iterator ) )
532
+ if ( this == null || ! Object . isFunction ( iterator ) )
523
533
throw new TypeError ( ) ;
534
+
535
+ var object = Object ( this ) ;
524
536
var results = [ ] , context = arguments [ 1 ] , value ;
525
537
526
- for ( var i = 0 , length = this . length ; i < length ; i ++ ) {
527
- if ( i in this ) {
528
- value = this [ i ] ;
529
- if ( iterator . call ( context , value , i , this ) ) {
538
+ for ( var i = 0 , length = object . length >>> 0 ; i < length ; i ++ ) {
539
+ if ( i in object ) {
540
+ value = object [ i ] ;
541
+ if ( iterator . call ( context , value , i , object ) ) {
530
542
results . push ( value ) ;
531
543
}
532
544
}
@@ -541,11 +553,13 @@ Array.from = $A;
541
553
}
542
554
543
555
function some ( iterator ) {
556
+ if ( this == null ) throw new TypeError ( ) ;
544
557
iterator = iterator || Prototype . K ;
545
558
var context = arguments [ 1 ] ;
546
559
547
- for ( var i = 0 , length = this . length ; i < length ; i ++ ) {
548
- if ( i in this && iterator . call ( context , this [ i ] , i , this ) ) {
560
+ var object = Object ( this ) ;
561
+ for ( var i = 0 , length = object . length >>> 0 ; i < length ; i ++ ) {
562
+ if ( i in object && iterator . call ( context , object [ i ] , i , object ) ) {
549
563
return true ;
550
564
}
551
565
}
@@ -558,11 +572,13 @@ Array.from = $A;
558
572
}
559
573
560
574
function every ( iterator ) {
575
+ if ( this == null ) throw new TypeError ( ) ;
561
576
iterator = iterator || Prototype . K ;
562
577
var context = arguments [ 1 ] ;
563
578
564
- for ( var i = 0 , length = this . length ; i < length ; i ++ ) {
565
- if ( i in this && ! iterator . call ( context , this [ i ] , i , this ) ) {
579
+ var object = Object ( this ) ;
580
+ for ( var i = 0 , length = object . length >>> 0 ; i < length ; i ++ ) {
581
+ if ( i in object && ! iterator . call ( context , object [ i ] , i , object ) ) {
566
582
return false ;
567
583
}
568
584
}
@@ -579,9 +595,9 @@ Array.from = $A;
579
595
function inject ( memo , iterator ) {
580
596
iterator = iterator || Prototype . K ;
581
597
var context = arguments [ 2 ] ;
582
- // The iterator must be bound, as `Array#reduce` always executes the
583
- // iterator in the global context .
584
- return _reduce . call ( this , iterator . bind ( context ) , memo , context ) ;
598
+ // The iterator must be bound, as `Array#reduce` always binds to
599
+ // `undefined` .
600
+ return _reduce . call ( this , iterator . bind ( context ) , memo ) ;
585
601
}
586
602
587
603
// Piggyback on `Array#reduce` if it exists; otherwise fall back to the
0 commit comments