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 07a7b3e4cf961e51bddcdb90cdca34f9126ed286
Showing with 238 additions and 100 deletions.
  1. +45 −28 src/core.js
  2. +193 −72 test/unit/core.js
@@ -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

This comment has been minimized.

Copy link
Member

replied Dec 11, 2012

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

This comment has been minimized.

Copy link
Member Author

replied Dec 11, 2012

Cool, I'm looking at this now

Please sign in to comment.
You can’t perform that action at this time.