* Made jQuery.marge more generic supporting null and undefined values, and supporting array like objects as results. Fixes #5527.
* Made jQuery.makeArray(nodeList) more safer using jQuery.merge internally. Fixes #5528.
* Added a second "results" argument to jQuery.makeArray for internal usage to avoid intermediary arrays in init.
this.context = selector.context;
}
this.context = selector.context;
}
- return this.setArray(jQuery.isArray( selector ) ?
- selector :
- jQuery.makeArray(selector));
+ return jQuery.isArray( selector ) ?
+ this.setArray( selector ) :
+ jQuery.makeArray( selector, this );
},
// Start with an empty selector
},
// Start with an empty selector
return (text || "").replace( rtrim, "" );
},
return (text || "").replace( rtrim, "" );
},
- makeArray: function( array ) {
- var ret = [], i;
+ // results is for internal usage only
+ makeArray: function( array, results ) {
+ var ret = results || [];
// The window, strings (and functions) also have 'length'
// The window, strings (and functions) also have 'length'
- if ( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval ) {
- ret[0] = array;
+ if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval ) {
+ push.call( ret, array );
- while ( i ) {
- ret[--i] = array[i];
- }
+ jQuery.merge( ret, array );
},
merge: function( first, second ) {
},
merge: function( first, second ) {
- // We have to loop this way because IE & Opera overwrite the length
- // expando of getElementsByTagName
- var i = 0, elem, pos = first.length;
+ var pos, i = second.length;
- while ( (elem = second[ i++ ]) != null ) {
- first[ pos++ ] = elem;
+ // We have to get length this way when IE & Opera overwrite the length
+ // expando of getElementsByTagName
+ if ( i && i.nodeType ) {
+ for ( i = 0; second[i]; ++i ) {}
+ }
+
+ pos = i + first.length;
+
+ // Correct length for non Arrays
+ first.length = pos;
+
+ while ( i ) {
+ first[ --pos ] = second[ --i ];
});
test("jQuery.merge()", function() {
});
test("jQuery.merge()", function() {
var parse = jQuery.merge;
var parse = jQuery.merge;
// Fixed at [5998], #3641
same( parse([-2,-1], [0,1,2]), [-2,-1,0,1,2], "Second array including a zero (falsy)");
// Fixed at [5998], #3641
same( parse([-2,-1], [0,1,2]), [-2,-1,0,1,2], "Second array including a zero (falsy)");
+
+ // After fixing #5527
+ same( parse([], [null, undefined]), [null, undefined], "Second array including null and undefined values");
+ same( parse({length:0}, [1,2]), {length:2, 0:1, 1:2}, "First array like");
});
test("jQuery.extend(Object, Object)", function() {
});
test("jQuery.extend(Object, Object)", function() {
var myKlass = function() {};
var customObject = new myKlass();
var myKlass = function() {};
var customObject = new myKlass();
- var optionsWithCustomObject = { foo: { date: new customObject } };
+ var optionsWithCustomObject = { foo: { date: customObject } };
empty = {};
jQuery.extend(true, empty, optionsWithCustomObject);
ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly (no methods)" );
empty = {};
jQuery.extend(true, empty, optionsWithCustomObject);
ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly (no methods)" );