`

underscore.extend与$.extend实例比较分析

阅读更多

underscore.extend实例

<html>
<head>
</head>
	<meta charset="GBK">
	<title>extend</title>
	<script type="text/javascript" src="jquery-1.8.3.js"></script>
	<script type="text/javascript" src="underscore-1.5.1.min.js"></script>
	<script type="text/javascript">
		$(document).ready(function() {
			var a = {
				name : 'zhangshan',
				age : 28,
				length : 180,
				company : {
					name : '腾讯',
					address : '深圳',
					size : 10000,
					baseInfo : {
						beginDate : '2015-03-08 00:00:00',
						endDate : undefined
					}
				}
			};
			var b = {
				name : 'lisi',
				age : 30,
				company : {
					name : '阿里巴巴',
					address : '杭州',
					baseInfo : {
						beginDate : '2015-03-08',
						endDate : '2016-03-08'
					}
				},
				stature : '172cm'
			};
			console.log('before extend:');
			console.log('a:' + JSON.stringify(a));  
			console.log('b:' + JSON.stringify(b)); 
			var c = _.extend(a,b);
			//var c = $.extend(a,b);
			//var c = $.extend(true,a,b);
			b.name = 'test';  
			b.company.address = '北京'; 
			console.log('after extend:');
			console.log('a:' + JSON.stringify(a));
			console.log('b:' + JSON.stringify(b));
			console.log('c:' + JSON.stringify(c));
			
			a.name = 'test002';
			a.company.address = '深圳';
			console.log('after modify a:');
			console.log('a:' + JSON.stringify(a));
			console.log('b:' + JSON.stringify(b));
			console.log('c:' + JSON.stringify(c));
		});
	</script>
<body>
</body>
</html>

运行结果:


        从运行结果来看,underscore的extend和jQuery的extend的浅拷贝是一样的,_.extend拷贝对象A时,对象B将拷贝A的所有字段,如果字段是内存地址,B将拷贝地址,若果字段是基元类型,B将复制其值。具体我们也可以再看看这篇文章http://bijian1013.iteye.com/blog/2255037

        当然,最简单的办法,我们直接将此实例改成$.extend(a,b)。

<html>
<head>
</head>
	<meta charset="GBK">
	<title>extend</title>
	<script type="text/javascript" src="jquery-1.8.3.js"></script>
	<script type="text/javascript" src="underscore-1.5.1.min.js"></script>
	<script type="text/javascript">
		$(document).ready(function() {
			var a = {
				name : 'zhangshan',
				age : 28,
				length : 180,
				company : {
					name : '腾讯',
					address : '深圳',
					size : 10000,
					baseInfo : {
						beginDate : '2015-03-08 00:00:00',
						endDate : undefined
					}
				}
			};
			var b = {
				name : 'lisi',
				age : 30,
				company : {
					name : '阿里巴巴',
					address : '杭州',
					baseInfo : {
						beginDate : '2015-03-08',
						endDate : '2016-03-08'
					}
				},
				stature : '172cm'
			};
			console.log('before extend:');
			console.log('a:' + JSON.stringify(a));  
			console.log('b:' + JSON.stringify(b)); 
			//var c = _.extend(a,b);
			var c = $.extend(a,b);
			//var c = $.extend(true,a,b);
			b.name = 'test';  
			b.company.address = '北京'; 
			console.log('after extend:');
			console.log('a:' + JSON.stringify(a));
			console.log('b:' + JSON.stringify(b));
			console.log('c:' + JSON.stringify(c));
			
			a.name = 'test002';
			a.company.address = '深圳';
			console.log('after modify a:');
			console.log('a:' + JSON.stringify(a));
			console.log('b:' + JSON.stringify(b));
			console.log('c:' + JSON.stringify(c));
		});
	</script>
<body>
</body>
</html>

运行结果和_.extend完全一样,如下所示:


        下面我们再来看下$.extend(true,a,b)即深拷贝的运行结果。

<html>
<head>
</head>
	<meta charset="GBK">
	<title>extend</title>
	<script type="text/javascript" src="jquery-1.8.3.js"></script>
	<script type="text/javascript" src="underscore-1.5.1.min.js"></script>
	<script type="text/javascript">
		$(document).ready(function() {
			var a = {
				name : 'zhangshan',
				age : 28,
				length : 180,
				company : {
					name : '腾讯',
					address : '深圳',
					size : 10000,
					baseInfo : {
						beginDate : '2015-03-08 00:00:00',
						endDate : undefined
					}
				}
			};
			var b = {
				name : 'lisi',
				age : 30,
				company : {
					name : '阿里巴巴',
					address : '杭州',
					baseInfo : {
						beginDate : '2015-03-08',
						endDate : '2016-03-08'
					}
				},
				stature : '172cm'
			};
			console.log('before extend:');
			console.log('a:' + JSON.stringify(a));  
			console.log('b:' + JSON.stringify(b)); 
			//var c = _.extend(a,b);
			//var c = $.extend(a,b);
			var c = $.extend(true,a,b);
			b.name = 'test';  
			b.company.address = '北京'; 
			console.log('after extend:');
			console.log('a:' + JSON.stringify(a));
			console.log('b:' + JSON.stringify(b));
			console.log('c:' + JSON.stringify(c));
			
			a.name = 'test002';
			a.company.address = '深圳';
			console.log('after modify a:');
			console.log('a:' + JSON.stringify(a));
			console.log('b:' + JSON.stringify(b));
			console.log('c:' + JSON.stringify(c));
		});
	</script>
<body>
</body>
</html>

运行结果:


        $.extend(true,A,B)会完全拷贝所有数据,优点是B与A不会相互依赖(A,B完全脱离关联)。

  • 大小: 51.3 KB
  • 大小: 49.2 KB
  • 大小: 50.6 KB
分享到:
评论

相关推荐

    bcakbone.js中Underscore.js实现的视图与子视图

    标题"bcakbone.js中Underscore.js实现的视图与子视图"指向了Backbone.js中如何利用Underscore.js来处理视图及其子视图的相关知识。在Backbone.js中,视图(View)是用户界面的抽象,负责渲染DOM元素和管理用户交互。...

    微信小程序demo:使用第三方模块Underscore.js,Immutable.js,UUID.zip

    3. **方便比较**:由于每次修改都会生成新实例,可以轻松地通过`===`进行浅比较,快速判断数据是否发生变化,简化状态管理。 **UUID** UUID(Universally Unique Identifier)是一种为电子设备、软件和文件系统生成...

    underscore-example:Underscore.js 演示

    《深入理解Underscore.js:基于“underscore-example”实例解析》 在JavaScript的世界里,Underscore.js是一款不可或缺的工具库,它为开发者提供了大量实用的函数,简化了日常编程任务。本文将通过"underscore-...

    Backbone.js的Hello World程序实例.docx

    在这个实例中,我们将看到如何整合Backbone.js与其他辅助库如jQuery、Underscore和Mustache来实现与后端数据的交互。 首先,我们需要创建一个后端PHP文件`api.php`,用于返回JSON格式的数据。在这个例子中,`api....

    BackBone介绍及使用

    Backbone与其他工具如jQuery、Underscore.js(提供实用函数库)、Handlebars(模板引擎)等配合使用,可以构建出功能强大的Web应用。例如,Underscore.js的模板功能可以让视图渲染更高效,而jQuery则简化了DOM操作。...

    backbone:主干下划线源码分析

    Underscore.js在这里提供了解析和操作数据的工具,如`_.extend`用于创建模型实例,`_.bind`用于绑定方法到特定上下文。 2. **视图(View)**:视图负责渲染和处理用户界面。它们与模型关联,当模型数据改变时,视图...

    requirejs todo 实例

    本实例将深入讲解如何使用RequireJS构建一个简单的待办事项(Todo)应用,以此来演示RequireJS的核心功能和优势。 在RequireJS中,我们首先需要设置配置文件(通常命名为`require.config`),用于指定脚本的路径、...

    Backbone制作联系人管理之列表(1)

    在本教程中,我们将探讨如何使用Backbone.js框架创建一...通过实际操作,你将更好地理解Backbone.js如何组织代码以及如何实现数据与视图的双向绑定。同时,这也会为你后续深入学习更复杂的Backbone应用打下坚实的基础。

    UNDERSCORE_jquery:查看UNDERSCORE和jquery

    6. **Ajax**:`$.ajax`,`$.get`,`$.post`等方法使得异步数据交互变得简单易用。 结合使用Underscore.js和jQuery,开发者可以充分利用各自的优势,构建出高效、可维护的前端应用。例如,Underscore可以用来处理...

    backbone demo

    你可以通过`Backbone.Model.extend()`方法创建自定义的模型。`initialize`方法在模型实例化时会被调用,可以用来初始化模型的属性。例如: ```javascript var User = Backbone.Model.extend({ initialize: ...

    JS MVC框架(BackBone)

    它的轻量化设计使得开发者可以快速上手,同时也允许与其他库和工具结合使用,如jQuery进行DOM操作,Underscore.js提供实用函数支持。然而,对于大型项目,可能需要更强大的框架,如Angular.js或React.js来提供更全面...

    backbone-viewmanager.js:启用在路由之间持久存在的骨干.js视图

    如果您的应用程序具有仅针对某些路由显示的视图,则一种方法是每次访问相应的路由时都创建视图的新实例。 但是这种方法是一些常见问题的根源。 如果您不记得在更改路线时手动关闭视图,则将在创建视图的多个副本时...

    backbone-lottery

    在实际代码中,开发者可能使用`Backbone.Model.extend()`来创建自定义模型,`Backbone.View.extend()`来创建视图,`Backbone.Collection.extend()`来创建集合,以及`Backbone.Router.extend()`来创建路由器。...

    ToDoList-Backbone:使用 Backbone 构建的待办事项列表

    在项目主入口文件中,我们需要实例化模型、集合、视图和路由器,然后启动路由器监听浏览器的URL变化: ```javascript var todos = new Todos(); todos.fetch(); // 从服务器获取数据 var todoView = new TodoView...

    bbtodo:使用 BackboneJS 的简单待办事项列表

    4. **Router** - 路由器,处理URL与应用状态之间的映射,实现页面无刷新的导航。 5. **Event** - 事件系统,使得Model、Collection和View之间可以通信,无需直接引用对方。 在“bbtodo”项目中,我们首先会创建一...

    Backbone_Example

    例如,`_.each`用于遍历数组或对象,`_.extend`用于对象扩展,`_.isEqual`用于深度比较等。 **3. Backbone.js 的关键组件** - **Model**: Model是Backbone的核心组件,用于封装和管理数据。它包含了数据属性和业务...

    BackbonePhpRequire:使用主干和 Require.js 的基本 php 模型

    在视图和路由器中,我们可以实例化这些模型和集合,并监听变化,以便在用户交互时更新界面。例如: ```javascript // view/UserListView.js define(['jquery', 'underscore', 'backbone', 'collection/Users'], ...

    require+backbone结合开发的例子

    这些文件共同构成了一个基于RequireJS和Backbone.js的完整应用实例,每个文件都是独立模块,通过RequireJS进行管理和通信。 总之,"require+backbone结合开发"是一种高效组织和管理Backbone应用的方式,它利用...

    BackboneTraining:这包括用于理解主干的简单示例

    默认情况下,它使用AJAX请求(jQuery的`$.ajax`)进行通信,但你可以覆盖此方法以实现自定义的通信协议,如WebSocket或WebRTC。 7. **模板(Templates)** Backbone鼓励使用客户端模板来动态构建UI。这通常通过...

Global site tag (gtag.js) - Google Analytics