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 相关文章推荐
Web版彷 Visual Studio 2003 颜色选择器
Jan 09 Javascript
JavaScript 事件参考手册
Dec 24 Javascript
基于jQuery的仿flash的广告轮播代码
Nov 04 Javascript
javascript动态加载三
Aug 22 Javascript
改进版通过Json对象实现深复制的方法
Oct 24 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
May 19 Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
Jun 01 Javascript
基于JavaScript实现类似于百度学术高级检索功能
Mar 02 Javascript
BootStrapTable 单选及取值的实现方法
Jan 10 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
Feb 28 Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 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
php调用mysql数据 dbclass类
2011/05/07 PHP
解析strtr函数的效率问题
2013/06/26 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
在js中使用&quot;with&quot;语句中跨frame的变量引用问题
2007/03/08 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
原生js实现放大镜
2017/02/20 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
[03:08]Ti4观战指南上
2014/07/07 DOTA
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
Django models filter筛选条件详解
2020/03/16 Python
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
20年同学聚会邀请函
2014/02/04 职场文书
企业金融服务方案
2014/06/03 职场文书
连锁超市项目计划书
2014/09/15 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python