Javascript引用指针使用介绍


Posted in Javascript onNovember 07, 2012

请尝试完成下列完形填空:

/* 创建一个队列,头为head0,尾为tail0 */ 
function IntList(head0, tail0){ 
this.head = head0 || 0; 
this.tail = tail0 || null; 
} 
/* 返回一个IntList包含数组中的所有数 */ 
IntList.list = function(__args){ 
var sentinel = new IntList(), 
len = __args.length, p = sentinel; 
for(var i = 0; i < len; i++){ 
p.tail = new IntList(__args[i]); 
p = p.tail; 
} 
return sentinel.tail; 
}; 
/* 返回该对象的字符串表示 */ 
IntList.prototype.toString = function(){ 
var temp = ""; 
temp += "["; 
for(var L = this; L !== null; L = L.tail){ 
temp = temp + " " + L.head; 
} 
temp += " ]"; 
return temp; 
}; 
/** 返回一个IntList,包含IntList A和IntList B, 
* 其中B的元素在A的后面。不能使用new关键字。 
*/ 
function dcatenate(A, B){ 
/* 完成功能 */ 
} 
/** 返回一个新的IntList,其长度为len, 
* 以#start元素为开头(其中#0是第一个元素), 
* 不能改变L。 
*/ 
function sublist(L, start, len){ 
/* 完成功能 */ 
}

这是一个用Javascript写的链表题。由于链表拥有较为复杂的引用操作,正好可以用来考察下对Javascript的引用的理解。附带简单的测试用例:
/* 测试dcatenate和sublist函数是否正确 */ 
function test(){ 
var A = IntList.list([4,6,7,3,8]), 
B = IntList.list([3,2,5,9]); 
dcatenate(A, B); 
if(A.toString() === "[ 4 6 7 3 8 3 2 5 9 ]"){ 
alert("dcatenate函数正确。"); 
}else{ 
alert("dcatenate函数错误。"); 
} 
var L = IntList.list([3,4,5,2,6,8,1,9]), 
result = sublist(L, 3, 3); 
if(result.toString() === "[ 2 6 8 ]"){ 
alert("sublist函数正确。"); 
}else{ 
alert("sublist函数正确。"); 
} 
}

Javascript引用?

实际上,在对变量赋予引用类型实例时,变量保存的是该实例的引用:

var temp = new Object();

Javascript引用指针使用介绍

这种表现非常切合它的名字,引用类型,其实例当然是来引用的。

而当将该变量再付给另一个变量的时候,实际上只是进行了对引用的复制操作:

var temp2 = temp;

Javascript引用指针使用介绍

所以虽然从定义式来看:temp2 = temp,但他们并没有直接联系,例如修改了temp的引用:

var temp = { 
name: "temp" 
}; 
var temp2 = temp; 
temp = { 
name: "not temp2" 
}; 
temp === temp2; //false

当然,如果我们修改的只是指针指向的实例本身,那么temp2依然等于temp:
var temp = { 
name: "temp" 
}; 
var temp2 = temp; 
temp.name = "also temp2"; 
temp === temp2; //true

IntList是什么东东?

我们来分析一下下图:

Javascript引用指针使用介绍

    创建两个空的变量,所以右图中L和Q是空的。创建一个新的IntList其头部为3,尾部为空,将L引用的值赋给Q,所以L和Q都指向这个新的IntList。Q指向一个新创建的IntList其头部为42,尾部为空,将Q的指针赋给L.tail,这样两个IntList被套嵌起来。

可见IntList是个通过指针达到多重套嵌的数据结构,被称为链表(Linked List)。

1.创建两个空的变量,所以右图中L和Q是空的。
2.创建一个新的IntList其头部为3,尾部为空,将L引用的值赋给Q,所以L和Q都指向这个新的IntList。
3.Q指向一个新创建的IntList其头部为42,尾部为空,将Q的指针赋给L.tail,这样两个IntList被套嵌起来。
可见IntList是个通过指针达到多重套嵌的数据结构,被称为链表(Linked List)。

IntList合并

我们只需要将其中一个的尾部指向另一个就行了。这样这两个IntList就连接起来了:

/** 返回一个IntList,包含IntList A和IntList B, 
* 其中B的元素在A的后面。不能使用new关键字。 
*/ 
function dcatenate(A, B){ 
var p; 
for(p = A; p != null; p = p.tail){ 
if(p.tail === null){ 
p.tail = B; 
break; 
} 
} 
return A 
}

IntList截取
由于题目要求不能改变原IntList,所以我们只能从原IntList取出数据再重建一个新的数据。
/** 返回一个新的IntList,其长度为len, 
* 以#start元素为开头(其中#0是第一个元素), 
* 不能改变L。 
*/ 
function sublist(L, start, len){ 
var K, 
P, 
J; 
var i = 0, 
end = start + len; 
for(P = L; i <= end; P = P.tail, i++){ 
if(i < start){ 
continue; 
}else if(i === start){ 
K = new IntList(P.head); 
J = K; 
}else if(i > start && i < end){ 
J.tail = new IntList(P.head); 
J = J.tail; 
}else if(i >= end){ 
break; 
} 
} 
return K; 
}

思考题
1.函数传参数的时候是怎么传的?例如下面代码的引用过程是怎样的?
var obj = { 
name: "anything" 
}; 
function getName(__obj){ 
return __obj.name; 
} 
var name = getName(obj);
Javascript 相关文章推荐
JavaScript检查弹出窗口是否被阻拦的方法技巧
Mar 13 Javascript
jQuery如何使用自动触发事件trigger
Nov 29 Javascript
JavaScript中的原型prototype完全解析
May 10 Javascript
JS获取地址栏参数的两种方法(简单实用)
Jun 14 Javascript
JavaScript代码里的判断小结
Aug 22 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 Javascript
基于node下的http小爬虫的示例代码
Jan 11 Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
Nov 15 Javascript
js实现json数组分组合并操作示例
Feb 12 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 Javascript
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
JavaScript在多浏览器下for循环的使用方法
Nov 07 #Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
Nov 07 #Javascript
JS正则中的RegExp对象对象
Nov 07 #Javascript
js模拟点击事件实现代码
Nov 06 #Javascript
js判断变量是否未定义的代码
Mar 28 #Javascript
jquery判断浏览器类型的代码
Nov 05 #Javascript
js实现翻页后保持checkbox选中状态的实现方法
Nov 03 #Javascript
You might like
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
php&amp;java(一)
2006/10/09 PHP
PHP里的中文变量说明
2011/07/23 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
斜45度寻路实现函数
2009/08/20 Javascript
JS delegate与live浅析
2013/12/21 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
详解python中TCP协议中的粘包问题
2019/03/22 Python
精彩的大学生自我评价
2013/11/17 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
小学教师国培感言
2014/02/08 职场文书
教师辞职信范文
2015/02/28 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
2015暑期社会实践通讯稿
2015/07/18 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
详解jQuery的核心函数和事件处理
2022/02/18 jQuery