JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性
说明(2017-4-2 18:27:11):
1. 作为函数的参数,就是将函数的数据拷贝一份,传递给函数的定义中的参数。
函数foo()在调用的时候,做了两件事:
(1)函数在调用的时候,首先需要将参数中的数据拷贝一份,即数字123拷贝一份。
(2)跳转到函数的定义中(函数体),在此之前完成了函数的赋值,即num=123。
(3)正式的进入函数内,准备执行函数的每一句话。
function foo(num){}
var a = 123;
foo(a);
2. 值类型作为函数参数传递的特征,函数内与函数外是两个不同的变量,仅仅是值相等而已。
3. 引用类型作为函数参数传递的特征,函数内与函数外是两个不同的变量,但是指向同一个对象。
*因此在函数内部允许修改函数外部的对象的数据。
例1:因为没有先定义p1,所以不存在p1这个对象。报错:不能设置“未定义”的name属性。
<script type="text/javascript">
var o = {name: "张三", age: 19, gender: "男"};
// copy拷贝的第二种方法,带参数(第一种方法是return返回值)
o.copy = function(obj){
for(var k in this){
obj[k] = this[k];
}
};
var p1;
o.copy(p1);
</script>

例2:copy函数里,设置了obj = {}。不报错,但watch里面先是仍然是未定义。因为obj已经重新指向了{}这个空对象,已经跟p1没有关系了,所以可以成功把name等属性赋值给obj,所以不报错(只不过函数运行完,函数里面的数据没有被引用着,这些数据就会被删除,释放内存)。但p1仍然是undefined。
<script type="text/javascript">
var o = {name: "张三", age: 19, gender: "男"};
// copy拷贝的第二种方法,带参数(第一种方法是return返回值)
o.copy = function(obj){
// 此处设置obj等于一个空对象,天坑!!!
var obj = {};
for(var k in this){
obj[k] = this[k];
}
};
var p1;
o.copy(p1);
</script>
例3:正确做法,直接在外面声明p1位一个空对象。这样参数obj也指向了同一个空对象,只要obj改变了,p1也随之改变。
<script type="text/javascript">
var o = {name: "张三", age: 19, gender: "男"};
// copy拷贝的第二种方法,带参数(第一种方法是return返回值)
o.copy = function(obj){
for(var k in this){
obj[k] = this[k];
}
};
// 正确做法,直接在外面声明p1位一个空对象。
var p1 = {};
o.copy(p1);
</script>
总结:
函数的参数,其实就是一个赋值过程,只不过“赋值”是直接赋值,而“参数”是隐形赋值看不见。
JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性的更多相关文章
- JavaScript高级 面向对象(5)--内存逻辑图画法
说明(2017.3.30): 1. 使用软件diagram designer,DiagramDesignerSetup1.28.zip,很小只有1M多,我用的自带画图软件.教学视频是“JavaScri ...
- [Clr via C#读书笔记]Cp5基元类型引用类型值类型
Cp5基元类型引用类型值类型 基元类型 编译器直接支持的类型,基元类型直接映射到FCL中存在的类型. 作者希望使用FCL类型名称而避免使用关键字.他的理由是为了更加的清晰的知道自己写的类型是哪种.但是 ...
- JavaScript高级 面向对象(6)--值类型与引用类型的存储特征
说明(2017.3.31): 1. 画图: var num = 123; var num2 = num; 值类型赋值的存储特点:将变量num内的数据全部拷贝一份,存储给新的变量num2,内存中有2个数 ...
- JavaScript高级 面向对象(4)--值类型和引用类型
说明(2017.3.30): 1. 变量只存数据本身就是值类型,如var a = 123, var a = "123"; 变量存的是一个引用,数据存在别的地方,就是引用类型,如数 ...
- JavaScript高级 面向对象的程序设计 (二)《JavaScript高级程序设计(第三版)》
二.继承 OO是面向对象语言最为有魅力的概念.一般的OO语言都实现了两种继承,接口继承和实现继承.接口继承只继承方法签名,而实际继承继承了实际的方法. 而在JS中,函数没有签名,所以无法实现接口继承. ...
- JavaScript高级 面向对象(1)--添加一个div标签
说明(2017.3.28): 1. JavaScript是一种基于对象的多范式编程语言,不是面向对象,但离开对象不能活. 范式编程是指编程习惯.方式,分为过程式.对象式和函数式编程. 2. 面向对象是 ...
- javascript函数参数、返回值类型检查
实现带参数.返回值类型声明的js函数: 类型定义:window.Str = Type.Str = Type.define('STRING', Type.isStr);var Per = Type.de ...
- JavaScript高级程序设计-(4) 引用类型
1.object var person={};//与new Object()相同 一般创建对象 var person=new Object(); person.Name="admin&quo ...
- JavaScript高级 面向对象的程序设计 (一)《JavaScript高级程序设计(第三版)》
创建对象 继承 面向对象的语言都有一个表示---类.通过类我们可以创建多个具有相同属性的对象.但是,在JS中并没有类的概念,所以JS的对象也和其他语言的对象不同. 对象的定义:无序的属性集合,其属性可 ...
随机推荐
- git学习笔记(四)—— 分支管理
一.创建与合并分支 git branch //查看分支 git branch <name> //创建分支 git checkout <name> //切换分支 git chec ...
- 【MySQL】mysql在Windows下使用mysqldump命令备份数据库
在cmd窗口中使用mysqldump命令首先需要配置环境变量 1,在计算机中找到MySQL的安装位置,找到MySQL Workbench,比如我的是C:\Program Files\MySQL\MyS ...
- JAVA项目如何通过Docker实现Jenkins持续部署
原文地址:http://blog.51cto.com/dadonggg/1957691 本篇实操性的案例讲解——JAVA项目如何通过Docker实现持续部署(只需简单四步), 即:开发通过git pu ...
- list、map、数组 转换
list,set,map,数组间的相互转换1.list转setSet set = new HashSet(new ArrayList()); 2.set转listList list = new Arr ...
- Bitnami Redmine 中文附件名 报错修复
最近自己在服务器上搭了个redmine,用的是Bitnami的一键安装程序. 搭好后,运行得不错,居然还增加了负载均衡. 某天上传中文附件,打开报内部错误,去redmine官网看了下,果然有这个问题, ...
- PowerShell 获取Site Collection下被签出的文件
由于权限的设置,当文件被签出时导致别人不可见了,这对校验文件个数的人来说着实是件烦恼的事.幸好利用PowerShell,可以获取Site Collection下被签出的文件. Resolution A ...
- Android Activity全面解析
Android Activity全面解析 首先,就从Android四大组件Activity开始. 1.Activity生命周期方法完全解析 activity_lifecycle.png 1).on ...
- 有用的 Mongo命令行 db.currentOp() db.collection.find().explain() - 摘自网络
在Heyzap 和 Bugsnag 我已经使用MongoDB超过一年了,我发现它是一个非常强大的数据库.和其他的数据库一样,它有一些缺陷,但是这里有一些东西我希望有人可以早一点告诉我的. 即使建立索引 ...
- 如何使你的Android应用记住曾经使用过的账户信息
原文:http://android.eoe.cn/topic/android_sdk 当您记住他们的名字时,每个人都会很喜欢.最简单的一个例子,您能够做的,让您的应用更加受人喜爱的,最有效的方法是记住 ...
- Cocos2d-x 源代码分析 : Scheduler(定时器) 源代码分析
源代码版本号 3.1r,转载请注明 我也最终不out了,開始看3.x的源代码了.此时此刻的心情仅仅能是wtf! !!!!!!! !.只是也最终告别CC时代了. cocos2d-x 源代码分析文件夹 h ...