]> source.dussan.org Git - jquery.git/commitdiff
Core: .each/.map should accept an undefined/null value
authorThomas Tortorini <thomastortorini@gmail.com>
Thu, 25 Jun 2015 04:18:04 +0000 (06:18 +0200)
committerMichał Gołębiowski <m.goleb@gmail.com>
Mon, 27 Jul 2015 18:02:54 +0000 (20:02 +0200)
(cherry-picked from bf48c21d225c31f0f9b5441d95f73615ca3dcfdb)

Fixes gh-2267
Closes gh-2363

src/core.js
test/unit/core.js

index b46698095f6c51732b27897ad9ba058926c14b87..6eae1990c9845e785f9bd22d9d4d8bdc22ea09bd 100644 (file)
@@ -294,11 +294,10 @@ jQuery.extend({
        },
 
        each: function( obj, callback ) {
-               var i = 0,
-                       length = obj.length,
-                       isArray = isArraylike( obj );
+               var length, i = 0;
 
-               if ( isArray ) {
+               if ( isArrayLike( obj ) ) {
+                       length = obj.length;
                        for ( ; i < length; i++ ) {
                                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
                                        break;
@@ -327,7 +326,7 @@ jQuery.extend({
                var ret = results || [];
 
                if ( arr != null ) {
-                       if ( isArraylike( Object(arr) ) ) {
+                       if ( isArrayLike( Object( arr ) ) ) {
                                jQuery.merge( ret,
                                        typeof arr === "string" ?
                                        [ arr ] : arr
@@ -405,14 +404,13 @@ jQuery.extend({
 
        // arg is for internal usage only
        map: function( elems, callback, arg ) {
-               var value,
+               var length, value,
                        i = 0,
-                       length = elems.length,
-                       isArray = isArraylike( elems ),
                        ret = [];
 
                // Go through the array, translating each of the items to their new values
-               if ( isArray ) {
+               if ( isArrayLike( elems ) ) {
+                       length = elems.length;
                        for ( ; i < length; i++ ) {
                                value = callback( elems[ i ], i, arg );
 
@@ -493,13 +491,13 @@ function(i, name) {
        class2type[ "[object " + name + "]" ] = name.toLowerCase();
 });
 
-function isArraylike( obj ) {
+function isArrayLike( obj ) {
 
        // Support: iOS 8.2 (not reproducible in simulator)
        // `in` check used to prevent JIT error (gh-2145)
        // hasOwn isn't used here due to false negatives
        // regarding Nodelist length in IE
-       var length = "length" in obj && obj.length,
+       var length = !!obj && "length" in obj && obj.length,
                type = jQuery.type( obj );
 
        if ( type === "function" || jQuery.isWindow( obj ) ) {
index 848ca2a5f9ee526082ce67e85220b07fc788f64a..1c52bde3b27b3ab417cbe1f3df1b11d3dc600049 100644 (file)
@@ -1182,6 +1182,18 @@ test("jQuery.each(Object,Function)", function() {
        equal( i, document.styleSheets.length, "Iteration over document.styleSheets" );
 });
 
+test("jQuery.each/map(undefined/null,Function)", 1, function() {
+       try {
+               jQuery.each( undefined, jQuery.noop );
+               jQuery.each( null, jQuery.noop );
+               jQuery.map( undefined, jQuery.noop );
+               jQuery.map( null, jQuery.noop );
+               ok( true, "jQuery.each/map( undefined/null, function() {} );" );
+       } catch ( e ) {
+               ok( false, "each/map must accept null and undefined values" );
+       }
+});
+
 test( "JIT compilation does not interfere with length retrieval (gh-2145)", function() {
        expect( 4 );