Add test for jQuery(jQueryObj) cloning and simplify new get() code
[jquery.git] / src / core.js
index 78f48d7..a74f0fe 100644 (file)
@@ -12,6 +12,9 @@ var jQuery = function( selector, context ) {
        // Map over the $ in case of overwrite
        _$ = window.$,
 
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+
        // A central reference to the root jQuery(document)
        rootjQuery,
 
@@ -36,16 +39,12 @@ jQuery.fn = jQuery.prototype = {
                var match, elem, ret;
 
                // Handle $(""), $(null), or $(undefined)
-               if ( !selector ) {
-                       this.length = 0;
-                       return this;
-               }
+               if ( !selector ) return this;
 
                // Handle $(DOMElement)
                if ( selector.nodeType ) {
-                       this[0] = selector;
-                       this.length = 1;
-                       this.context = selector;
+                       this.context = this[0] = selector;
+                       this.length++;
                        return this;
                }
 
@@ -65,17 +64,19 @@ jQuery.fn = jQuery.prototype = {
                                } else {
                                        elem = document.getElementById( match[3] );
 
-                                       // Handle the case where IE and Opera return items
-                                       // by name instead of ID
-                                       if ( elem && elem.id !== match[3] ) {
-                                               return rootjQuery.find( selector );
+                                       if ( elem ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[3] ) return rootjQuery.find( selector );
+
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length++;
+                                               this[0] = elem;
                                        }
 
-                                       // Otherwise, we inject the element directly into the jQuery object
-                                       ret = jQuery( elem || null );
-                                       ret.context = document;
-                                       ret.selector = selector;
-                                       return ret;
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
                                }
 
                        // HANDLE: $(expr, $(...))
@@ -111,21 +112,26 @@ jQuery.fn = jQuery.prototype = {
        // The current version of jQuery being used
        jquery: "@VERSION",
 
+       // The default length of a jQuery object is 0
+       length: 0,
+
        // The number of elements contained in the matched element set
        size: function() {
                return this.length;
        },
 
+       toArray: Array.prototype.slice,
+
        // Get the Nth element in the matched element set OR
        // Get the whole matched element set as a clean array
        get: function( num ) {
                return num == null ?
 
                        // Return a 'clean' array
-                       Array.prototype.slice.call( this ) :
+                       this.toArray() :
 
                        // Return just the object
-                       this[ num ];
+                       ( num < 0 ? this.toArray(num)[ 0 ] : this[ num ] );
        },
 
        // Take an array of elements and push it onto the stack
@@ -235,9 +241,15 @@ jQuery.extend = jQuery.fn.extend = function() {
 
                                // Recurse if we're merging object values
                                if ( deep && copy && typeof copy === "object" && !copy.nodeType ) {
-                                       target[ name ] = jQuery.extend( deep,
-                                               // Never move original objects, clone them
-                                               src || ( copy.length != null ? [ ] : { } ), copy );
+                                       var clone;
+
+                                       if( src ) clone = src;
+                                       else if( jQuery.isArray(copy) ) clone = [ ];
+                                       else if( jQuery.isObject(copy) ) clone = { };
+                                       else clone = copy;
+
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
 
                                // Don't bring in undefined values
                                } else if ( copy !== undefined ) {
@@ -273,6 +285,16 @@ jQuery.extend({
                return toString.call(obj) === "[object Array]";
        },
 
+       isObject: function( obj ) {
+               return this.constructor.call(obj) === Object;
+       },
+
+       isEmptyObject: function( obj ) {
+               for(var name in obj)
+                       return false;
+               return true;
+       },
+
        // check if an element is in a (or is an) XML document
        isXMLDoc: function( elem ) {
                return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
@@ -307,7 +329,7 @@ jQuery.extend({
 
        // args is for internal usage only
        each: function( object, callback, args ) {
-               var name, i = 0, 
+               var name, i = 0,
                        length = object.length,
                        isObj = length === undefined || jQuery.isFunction(object);