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的对象也和其他语言的对象不同. 对象的定义:无序的属性集合,其属性可 ...
 
随机推荐
- React icon bak
 - 【转载并整理】filter、servlet、interceptor、listener区别
			
参考文章:https://blog.csdn.net/u013087513/article/details/56835894 一.servlet servlet是一种运行服务器端的java应用程序,具 ...
 - MySQL复制表结构、表数据
			
1.复制表结构及数据到新表 CREATE TABLE 新表SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable; ...
 - Echarts 如何与 百度地图结合?
			
官方demo:http://echarts.baidu.com/examples/editor.html?c=map-polygon 需要按顺序加载以下几个资源,然后就可以在echarts配置中使用 ...
 - 视图不能由多个 ListView 共享 (View can't be shared by more than one ListView) 的一个解决方法
			
1.问题的起因 在WPF中遇到一异常,如题. 因此做一个Demo代码来复现问题,代码如下: <Window x:Class="WpfAppThread.MainWindow" ...
 - jmeter压测前清理内存
			
jmeter 压测时设置了内存为sed -i 's/HEAP="-Xms512m -Xmx512m"/HEAP="-Xms36096m -Xmx360096m" ...
 - 使用layui 和 jquery 问题小结
			
问题 1 在使用 layui 2.2.5 之前,可以引入最新版的 jquery ,使用更好的性能.也可以使用layui 的jquery内部版本.如果引入要在引入layui.js 之前引入 2 使用 s ...
 - MongoDB索引相关文章-摘自网络
			
索引类型 虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique).稀疏索引(sparse).多值索引(multikey)等几种类型. 唯一索引 唯 ...
 - 实现session(session数据)的共享,解决分布式session共享
			
为什么要实现共享? 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话 ...
 - 2.2 Apache Axis2 快速学习手册之 AXIOM 构建 Web Service
			
和上一篇的POJO 部署相比主要是services.xml 中配置的消息接受处理器类不一样和Java 类中写法不一样. 使用AXIOM构建服务 样例源码路径: C:\Apps\axis2\axis2- ...