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 日期转换成中文格式的函数
Jul 07 Javascript
JavaScript 盒模型 尺寸深入理解
Dec 31 Javascript
用javascript判断IE版本号简单实用且向后兼容
Sep 11 Javascript
使用script的src实现跨域和类似ajax效果
Nov 10 Javascript
jQuery实现图片渐入渐出切换展示效果
Aug 15 Javascript
jQuery判断浏览器并动态调整select宽度的方法
Mar 02 Javascript
JS中用try catch对代码运行的性能影响分析
Dec 26 Javascript
vue按需加载组件webpack require.ensure的方法
Dec 13 Javascript
利用vue开发一个所谓的数独方法实例
Dec 21 Javascript
vue 插值 v-once,v-text, v-html详解
Jan 19 Javascript
JS document form表单元素操作完整示例
Jan 13 Javascript
Jquery使用each函数实现遍历及数组处理
Jul 14 jQuery
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
Zend的AutoLoad机制介绍
2012/09/27 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
js正确获取元素样式详解
2009/08/07 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
JS实现在线ps功能详解
2019/07/31 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
Python常用列表数据结构小结
2014/08/06 Python
Python发送email的3种方法
2015/04/28 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
黄金搭档广告词
2014/03/21 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
公司晚会主持词
2019/04/17 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
Python3 类型标注支持操作
2021/06/02 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
golang的文件创建及读写操作
2022/04/14 Golang
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers