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 以对象为索引的关联数组
May 19 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
Feb 16 Javascript
运算符&amp;&amp;的三个不同层次
Apr 07 Javascript
JS 修改URL参数(实现代码)
Jul 08 Javascript
gridpanel动态加载数据的实例代码
Jul 18 Javascript
JavaScript实现带标题的图片轮播特效
May 20 Javascript
jquery无限级联下拉菜单简单实例演示
Nov 23 Javascript
js倒计时简单实现方法
Dec 17 Javascript
浅析Javascript中bind()方法的使用与实现
May 30 Javascript
vue.js实现备忘录功能的方法
Jul 10 Javascript
浅谈javascript如何获取文件后缀名
Aug 07 Javascript
js实现纯前端压缩图片
Nov 16 Javascript
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
十大“创意”战术!
2020/03/04 星际争霸
用PHP调用Oracle存储过程
2006/10/09 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
基于jQuery的js分页代码
2010/06/10 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
node上的redis调用优化示例详解
2018/10/30 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
Python批量修改文件后缀的方法
2014/01/26 Python
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
Python3进制之间的转换代码实例
2019/08/24 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
什么是抽象
2015/12/13 面试题
幼儿园英语教学反思
2014/01/30 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
总经理岗位职责
2015/02/04 职场文书
2015年导购员工作总结
2015/04/25 职场文书
三方合作意向书范本
2015/05/09 职场文书
详解Python牛顿插值法
2021/05/11 Python
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers
python turtle绘图
2022/05/04 Python