jQuery中的$.extend淺拷貝,拷貝對象A時,對象B將拷貝A的全部字段,若是字段是內存地址,B將拷貝地址,若果字段是基元類型,B將複製其值。它的缺點是若是你改變了對象B所指向的內存地址,你同時也改變了對象A指向這個地址的字段。javascript
jQuery中的$.extend深拷貝,這種方式會徹底拷貝全部數據,優勢是B與A不會相互依賴(A,B徹底脫離關聯), 缺點是拷貝的速度更慢,代價更大。html
一.$.extend淺拷貝java
$.extend淺拷貝實例一,$.extend(a,b)用法,$.extend淺拷貝拷貝對象A時,對象B將拷貝A的全部字段,若是字段是內存地址,B將拷貝地址,若果字段是基元類型,B將複製其值。jquery
Html代碼 app

- <html>
- <head>
- </head>
- <meta charset="GBK">
- <title>StudyDemo01</title>
- <script type="text/javascript" src="jquery-1.8.3.js"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- var a = {
- name : 'zhangshan',
- age : 28,
- company : {
- name : '騰訊',
- address : '深圳',
- size : 10000
- }
- };
- var b = {
- name : 'lisi',
- age : 30,
- company : {
- name : '阿里巴巴',
- address : '杭州'
- },
- stature : '172cm'
- };
- var c = $.extend(a,b);
- console.log('a:' + JSON.stringify(a));
- console.log('b:' + JSON.stringify(b));
- console.log('c:' + JSON.stringify(c));
- });
- </script>
- <body>
- </body>
- </html>
運行結果:oop
Text代碼 this

- a:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州"},"stature":"172cm"}
- b:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州"},"stature":"172cm"}
- c:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州"},"stature":"172cm"}
$.extend淺拷貝實例二,$.extend(a,b)用法,若是你改變了對象B所指向的內存地址,你同時也改變了對象A指向這個地址的字段。spa
Html代碼 htm

- <html>
- <head>
- </head>
- <meta charset="GBK">
- <title>StudyDemo02</title>
- <script type="text/javascript" src="jquery-1.8.3.js"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- var a = {
- name : 'zhangshan',
- age : 28,
- company : {
- name : '騰訊',
- address : '深圳',
- size : 10000
- }
- };
- var b = {
- name : 'lisi',
- age : 30,
- company : {
- name : '阿里巴巴',
- address : '杭州'
- },
- stature : '172cm'
- };
- var c = $.extend(a,b);
- b.name = 'test';
- b.company.address = '北京';
- console.log('a:' + JSON.stringify(a));
- console.log('b:' + JSON.stringify(b));
- console.log('c:' + JSON.stringify(c));
- });
- </script>
- <body>
- </body>
- </html>
運行結果:對象
Text代碼

- a:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"北京"},"stature":"172cm"}
- b:{"name":"test","age":30,"company":{"name":"阿里巴巴","address":"北京"},"stature":"172cm"}
- c:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"北京"},"stature":"172cm"}
$.extend淺拷貝實例三,$.extend({},a,b)用法
Html代碼

- <html>
- <head>
- </head>
- <meta charset="GBK">
- <title>StudyDemo03</title>
- <script type="text/javascript" src="jquery-1.8.3.js"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- var a = {
- name : 'zhangshan',
- age : 28,
- company : {
- name : '騰訊',
- address : '深圳',
- size : 10000
- }
- };
- var b = {
- name : 'lisi',
- age : 30,
- company : {
- name : '阿里巴巴',
- address : '杭州'
- },
- stature : '172cm'
- };
- var c = $.extend({},a,b);
- console.log('a:' + JSON.stringify(a));
- console.log('b:' + JSON.stringify(b));
- console.log('c:' + JSON.stringify(c));
- });
- </script>
- <body>
- </body>
- </html>
運行結果:
Text代碼

- a:{"name":"zhangshan","age":28,"company":{"name":"騰訊","address":"深圳","size":10000}}
- b:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州"},"stature":"172cm"}
- c:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州"},"stature":"172cm"}
$.extend淺拷貝實例四,$.extend({},a,b)用法
Html代碼

- <html>
- <head>
- </head>
- <meta charset="GBK">
- <title>StudyDemo04</title>
- <script type="text/javascript" src="jquery-1.8.3.js"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- var a = {
- name : 'zhangshan',
- age : 28,
- company : {
- name : '騰訊',
- address : '深圳',
- size : 10000
- }
- };
- var b = {
- name : 'lisi',
- age : 30,
- company : {
- name : '阿里巴巴',
- address : '杭州'
- },
- stature : '172cm'
- };
- var c = $.extend({},a,b);
- a.name = 'zhangshan01';
- b.name = 'lisi01';
- b.company.address = 'shengzhen';
- console.log('a:' + JSON.stringify(a));
- console.log('b:' + JSON.stringify(b));
- console.log('c:' + JSON.stringify(c));
- });
- </script>
- <body>
- </body>
- </html>
運行結果:
Text代碼

- a:{"name":"zhangshan01","age":28,"company":{"name":"騰訊","address":"深圳","size":10000}}
- b:{"name":"lisi01","age":30,"company":{"name":"阿里巴巴","address":"shengzhen"},"stature":"172cm"}
- c:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"shengzhen"},"stature":"172cm"}
由$.extend淺拷貝實例3、實例四不難發現,$.extend({},a,b)方法會依次拷貝a、b對象,且b裏面的對象是內存地址的拷貝(加上b.company.address = 'shengzhen';語句後執行結果能夠看出)。
二.$.extend深拷貝
$.extend深拷貝實例一,$.extend(true,a,b)用法
Html代碼

- <html>
- <head>
- </head>
- <meta charset="GBK">
- <title>StudyDemo05</title>
- <script type="text/javascript" src="jquery-1.8.3.js"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- var a = {
- name : 'zhangshan',
- age : 28,
- company : {
- name : '騰訊',
- address : '深圳',
- size : 10000
- }
- };
- var b = {
- name : 'lisi',
- age : 30,
- company : {
- name : '阿里巴巴',
- address : '杭州'
- },
- stature : '172cm'
- };
- var c = $.extend(true,a,b);
- console.log('a:' + JSON.stringify(a));
- console.log('b:' + JSON.stringify(b));
- console.log('c:' + JSON.stringify(c));
- });
- </script>
- <body>
- </body>
- </html>
運行結果:
Text代碼

- a:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州","size":10000},"stature":"172cm"}
- b:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州"},"stature":"172cm"}
- c:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州","size":10000},"stature":"172cm"}
$.extend深拷貝實例二,$.extend(true,a,b)以後,修改b對象
Html代碼

- <html>
- <head>
- </head>
- <meta charset="GBK">
- <title>StudyDemo06</title>
- <script type="text/javascript" src="jquery-1.8.3.js"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- var a = {
- name : 'zhangshan',
- age : 28,
- company : {
- name : '騰訊',
- address : '深圳',
- size : 10000
- }
- };
- var b = {
- name : 'lisi',
- age : 30,
- company : {
- name : '阿里巴巴',
- address : '杭州'
- },
- stature : '172cm'
- };
- var c = $.extend(true,a,b);
- b.name = 'test';
- b.company.address = '北京';
- console.log('a:' + JSON.stringify(a));
- console.log('b:' + JSON.stringify(b));
- console.log('c:' + JSON.stringify(c));
- });
- </script>
- <body>
- </body>
- </html>
運行結果:
Text代碼

- a:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州","size":10000},"stature":"172cm"}
- b:{"name":"test","age":30,"company":{"name":"阿里巴巴","address":"北京"},"stature":"172cm"}
- c:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州","size":10000},"stature":"172cm"}
$.extend深拷貝實例三
Html代碼

- <html>
- <head>
- </head>
- <meta charset="GBK">
- <title>StudyDemo07</title>
- <script type="text/javascript" src="jquery-1.8.3.js"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- var a = {
- name : 'zhangshan',
- age : 28,
- company : {
- name : '騰訊',
- address : '深圳',
- size : 10000
- }
- };
- var b = {
- name : 'lisi',
- age : 30,
- company : {
- name : '阿里巴巴',
- address : '杭州'
- },
- stature : '172cm'
- };
- var c = $.extend(true,{},a,b);
- console.log('a:' + JSON.stringify(a));
- console.log('b:' + JSON.stringify(b));
- console.log('c:' + JSON.stringify(c));
- });
- </script>
- <body>
- </body>
- </html>
運行結果:
Text代碼

- a:{"name":"zhangshan","age":28,"company":{"name":"騰訊","address":"深圳","size":10000}}
- b:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州"},"stature":"172cm"}
- c:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州","size":10000},"stature":"172cm"}
$.extend深拷貝實例四,修改b對象
Html代碼

- <html>
- <head>
- </head>
- <meta charset="GBK">
- <title>StudyDemo08</title>
- <script type="text/javascript" src="jquery-1.8.3.js"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- var a = {
- name : 'zhangshan',
- age : 28,
- company : {
- name : '騰訊',
- address : '深圳',
- size : 10000
- }
- };
- var b = {
- name : 'lisi',
- age : 30,
- company : {
- name : '阿里巴巴',
- address : '杭州'
- },
- stature : '172cm'
- };
- var c = $.extend(true,{},a,b);
- a.name = 'zhangshan01';
- b.name = 'lisi01';
- b.company.address = 'shengzhen';
- console.log('a:' + JSON.stringify(a));
- console.log('b:' + JSON.stringify(b));
- console.log('c:' + JSON.stringify(c));
- });
- </script>
- <body>
- </body>
- </html>
運行結果:
Text代碼

- a:{"name":"zhangshan01","age":28,"company":{"name":"騰訊","address":"深圳","size":10000}}
- b:{"name":"lisi01","age":30,"company":{"name":"阿里巴巴","address":"shengzhen"},"stature":"172cm"}
- c:{"name":"lisi","age":30,"company":{"name":"阿里巴巴","address":"杭州","size":10000},"stature":"172cm"}
三.$.extend源代碼
查看分析$.extend源代碼,咱們就不難理解上面實例的運行結果了
Js代碼

- jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray(src) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
- };