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 相关文章推荐
JS 常用校验函数
Mar 26 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
Nov 03 Javascript
jquery获取tr并更改tr内容示例代码
Feb 13 Javascript
jquery退出each循环的写法
Feb 26 Javascript
Jquery中offset()和position()的区别分析
Feb 05 Javascript
jquery常用函数与方法汇总
Sep 01 Javascript
jquery判断iPhone、Android设备类型
Sep 14 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
jQuery鼠标移动图片上实现放大效果
Jun 25 jQuery
vue双向绑定数据限制长度的方法
Nov 04 Javascript
weui中的picker使用js进行动态绑定数据问题
Nov 06 Javascript
JS async 函数的含义和用法实例总结
Apr 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语法(5)
2006/10/09 PHP
PHP随机数生成代码与使用实例分析
2011/04/08 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
2016/02/01 PHP
php bootstrap实现简单登录
2016/03/08 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
深入Python解释器理解Python中的字节码
2015/04/01 Python
Python二分查找详解
2015/09/13 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
在vscode中配置python环境过程解析
2019/09/28 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
2020/06/18 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
经管应届生求职信
2013/11/17 职场文书
财务主管的岗位职责
2013/12/30 职场文书
大一军训感言
2014/01/09 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
员工手册董事长致辞
2015/07/29 职场文书
爱国之歌(8首)
2019/09/29 职场文书
python通过新建环境安装tfx的问题
2022/05/20 Python