Skip to content
Permalink
Browse files
Fixes #13021. Normalization of core utility array like detection base…
…d on standard protocol by Richard Gibson <richard.gibson@gmail.com>. Closes gh-1064
  • Loading branch information
rwaldron committed Dec 10, 2012
1 parent 7d5b86e commit 07a7b3e
Show file tree
Hide file tree
Showing 2 changed files with 238 additions and 100 deletions.
@@ -583,37 +583,45 @@ jQuery.extend({

// args is for internal usage only
each: function( obj, callback, args ) {
var name,
var value,
i = 0,
length = obj.length,
isObj = length === undefined || jQuery.isFunction( obj );
isArray = isArraylike( obj );

if ( args ) {
if ( isObj ) {
for ( name in obj ) {
if ( callback.apply( obj[ name ], args ) === false ) {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.apply( obj[ i ], args );

if ( value === false ) {
break;
}
}
} else {
for ( ; i < length; ) {
if ( callback.apply( obj[ i++ ], args ) === false ) {
for ( i in obj ) {
value = callback.apply( obj[ i ], args );

if ( value === false ) {
break;
}
}
}

// A special, fast, case for the most common use of each
} else {
if ( isObj ) {
for ( name in obj ) {
if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.call( obj[ i ], i, obj[ i ] );

if ( value === false ) {
break;
}
}
} else {
for ( ; i < length; ) {
if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
for ( i in obj ) {
value = callback.call( obj[ i ], i, obj[ i ] );

if ( value === false ) {
break;
}
}
@@ -640,18 +648,16 @@ jQuery.extend({

// results is for internal usage only
makeArray: function( arr, results ) {
var type,
ret = results || [];
var ret = results || [];

if ( arr != null ) {
// The window, strings (and functions) also have 'length'
// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
type = jQuery.type( arr );

if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
core_push.call( ret, arr );
if ( isArraylike( Object(arr) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
[ arr ] : arr
);
} else {
jQuery.merge( ret, arr );
core_push.call( ret, arr );
}
}

@@ -689,7 +695,6 @@ jQuery.extend({
for ( ; j < l; j++ ) {
first[ i++ ] = second[ j ];
}

} else {
while ( second[j] !== undefined ) {
first[ i++ ] = second[ j++ ];
@@ -722,12 +727,11 @@ jQuery.extend({

// arg is for internal usage only
map: function( elems, callback, arg ) {
var value, key,
ret = [],
var value,
i = 0,
length = elems.length,
// jquery objects are treated as arrays
isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
isArray = isArraylike( elems ),
ret = [];

// Go through the array, translating each of the items to their
if ( isArray ) {
@@ -741,8 +745,8 @@ jQuery.extend({

// Go through every key on the object,
} else {
for ( key in elems ) {
value = callback( elems[ key ], key, arg );
for ( i in elems ) {
value = callback( elems[ i ], i, arg );

if ( value != null ) {
ret[ ret.length ] = value;
@@ -907,5 +911,18 @@ jQuery.each("Boolean Number String Function Array Date RegExp Object Error".spli
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});

function isArraylike( obj ) {
var length = obj.length,
type = jQuery.type( obj );

if ( jQuery.isWindow( obj ) ) {
return false;
}

return type === "array" || type !== "function" &&
( length === 0 ||
typeof length === "number" && length > 0 && ( length - 1 ) in obj );
}

// All jQuery objects should point back to these
rootjQuery = jQuery(document);

2 comments on commit 07a7b3e

@Krinkle
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It appears this (consistently/reproducibly) broke 1 unit test in Firefox 16 and Firefox 17. http://swarm.jquery.org/job/1832

  • core Pass makeArray a form (treat as elements) Rerun

@rwaldron
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool, I'm looking at this now

Please sign in to comment.