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初学困境—js初学
Dec 29 Javascript
JavaScript基本概念初级讲解论坛贴的学习记录
Feb 22 Javascript
新鲜出炉的js tips提示效果
Apr 03 Javascript
JavaScript实现网页上的浮动广告的简单方法
Jun 14 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
Oct 09 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
Jan 27 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
May 30 Javascript
React如何避免重渲染
Apr 10 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
Apr 12 jQuery
JS拖动选择table里的单元格完整实例【基于jQuery】
May 28 jQuery
Vue Extends 扩展选项用法完整实例
Sep 17 Javascript
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 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
PHP缓存技术的使用说明
2011/08/06 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
PHP连接access数据库
2015/03/27 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
数理公式,也可以这么唯美
2021/03/10 无线电
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
python3之微信文章爬虫实例讲解
2017/07/12 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
数控技术专业推荐信
2013/11/01 职场文书
高中毕业生生活的自我评价
2013/12/08 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
教师个人培训总结
2015/02/11 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
《迟到》教学反思
2016/02/24 职场文书
导游词之峨眉山
2019/12/16 职场文书
java多态注意项小结
2021/10/16 Java/Android
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技