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 相关文章推荐
EasySlider 基于jQuery功能强大简单易用的滑动门插件
Jun 11 Javascript
jquery获取html元素的绝对位置和相对位置的方法
Jun 20 Javascript
Javascript基础教程之定义和调用函数
Jan 18 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
May 25 Javascript
第二篇Bootstrap起步
Jun 21 Javascript
基于jQuery制作小图标上下滑动特效
Jan 18 Javascript
关于javascript获取内联样式与嵌入式样式的实例
Jun 01 Javascript
protractor的安装与基本使用教程
Jul 07 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
Sep 10 Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 Javascript
js校验开始时间和结束时间
May 26 Javascript
javascript使用canvas实现饼状图效果
Sep 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 中文处理技巧
2010/04/25 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
python cookielib 登录人人网的实现代码
2012/12/19 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
Pycharm以root权限运行脚本的方法
2019/01/19 Python
python入门之井字棋小游戏
2020/03/05 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
zooplus波兰:在线宠物店
2019/07/21 全球购物
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
计算机应用职专应届生求职信
2013/11/12 职场文书
策划主管的工作职责
2013/11/24 职场文书
大学军训感言1000字
2014/02/25 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
合作协议书范本
2014/10/25 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
 Python 中 logging 模块使用详情
2022/03/03 Python