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 相关文章推荐
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
Dec 02 Javascript
善用事件代理,警惕闭包的性能陷阱。
Jan 20 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
Mar 13 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
Apr 25 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
Jan 19 Javascript
js获取时间精确到秒(年月日)
Mar 16 Javascript
深入理解js数组的sort排序
May 28 Javascript
Jquery调用iframe父页面中的元素及方法
Aug 23 Javascript
jquery横向纵向鼠标滚轮全屏切换
Feb 27 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
Jun 14 Javascript
vue中实现图片压缩 file文件的方法
May 28 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
Jul 27 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
理解Javascript_13_执行模型详解
2010/10/20 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
jQuery实现日历效果
2020/09/11 jQuery
python实现Zabbix-API监控
2018/09/17 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
什么是方法的重载
2013/06/24 面试题
总裁办公室主任职责
2014/01/02 职场文书
给领导的检讨书
2014/02/16 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
2015年春节标语口号
2014/12/09 职场文书
四年级小学生评语
2014/12/26 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js