说明(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)--引用类型值类型作为参数传递的特性的更多相关文章

  1. JavaScript高级 面向对象(5)--内存逻辑图画法

    说明(2017.3.30): 1. 使用软件diagram designer,DiagramDesignerSetup1.28.zip,很小只有1M多,我用的自带画图软件.教学视频是“JavaScri ...

  2. [Clr via C#读书笔记]Cp5基元类型引用类型值类型

    Cp5基元类型引用类型值类型 基元类型 编译器直接支持的类型,基元类型直接映射到FCL中存在的类型. 作者希望使用FCL类型名称而避免使用关键字.他的理由是为了更加的清晰的知道自己写的类型是哪种.但是 ...

  3. JavaScript高级 面向对象(6)--值类型与引用类型的存储特征

    说明(2017.3.31): 1. 画图: var num = 123; var num2 = num; 值类型赋值的存储特点:将变量num内的数据全部拷贝一份,存储给新的变量num2,内存中有2个数 ...

  4. JavaScript高级 面向对象(4)--值类型和引用类型

    说明(2017.3.30): 1. 变量只存数据本身就是值类型,如var a = 123, var a = "123";  变量存的是一个引用,数据存在别的地方,就是引用类型,如数 ...

  5. JavaScript高级 面向对象的程序设计 (二)《JavaScript高级程序设计(第三版)》

    二.继承 OO是面向对象语言最为有魅力的概念.一般的OO语言都实现了两种继承,接口继承和实现继承.接口继承只继承方法签名,而实际继承继承了实际的方法. 而在JS中,函数没有签名,所以无法实现接口继承. ...

  6. JavaScript高级 面向对象(1)--添加一个div标签

    说明(2017.3.28): 1. JavaScript是一种基于对象的多范式编程语言,不是面向对象,但离开对象不能活. 范式编程是指编程习惯.方式,分为过程式.对象式和函数式编程. 2. 面向对象是 ...

  7. javascript函数参数、返回值类型检查

    实现带参数.返回值类型声明的js函数: 类型定义:window.Str = Type.Str = Type.define('STRING', Type.isStr);var Per = Type.de ...

  8. JavaScript高级程序设计-(4) 引用类型

    1.object var person={};//与new Object()相同 一般创建对象 var person=new Object(); person.Name="admin&quo ...

  9. JavaScript高级 面向对象的程序设计 (一)《JavaScript高级程序设计(第三版)》

    创建对象 继承 面向对象的语言都有一个表示---类.通过类我们可以创建多个具有相同属性的对象.但是,在JS中并没有类的概念,所以JS的对象也和其他语言的对象不同. 对象的定义:无序的属性集合,其属性可 ...

随机推荐

  1. php 执行命令函数

    /** Method to execute a command in the terminal Uses : 1. system 2. passthru 3. exec 4. shell_exec * ...

  2. 基于js利用经纬度进行两地的距离计算(转)

    转自:http://www.storyday.com/html/y2009/2212_according-to-latitude-and-longitude-distance-calculation- ...

  3. 【C#】C#创建Windows Service服务

    目录结构: contents structure [+] 创建Windows服务 配置 安装Windows服务 在Visual Studio中调试 常见问题 最近写了一个TCP连接的程序,由于这种通信 ...

  4. block(四)揭开神秘面纱(下)-b

    看此篇时,请大家同时打开两个网址(或者下载它们到本地然后打开): http://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/BlocksRuntim ...

  5. ASP.NET MVC同时支持web与webapi模式

    原文地址:https://blog.csdn.net/laymat/article/details/65444701 我们在创建 web mvc项目时是不支持web api的接口方式访问的,所以我们需 ...

  6. thinkphp导航高亮的方法

    因为引入了公共的 header.html,所以需要使用 js来实现向 li 加入active的高亮属性,这里我通过url地址和href的地址进行判断 // 这里对当前页面导航高亮 $(function ...

  7. FreeSWITCH增加iLBC编码

    1. 安装ilbc库从第三方库里下载指定版本 git clone https://freeswitch.org/stash/scm/sd/libilbc.git ./bootstrap.sh ./co ...

  8. Maven 遇到的问题记录及解决

    1. 打包或clean时报错:To see the full stack trace of the errors, re-run Maven with the -e switch [WARNING] ...

  9. 用友iuap云运维平台支持基于K8s的微服务架构

    什么是微服务架构? 微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大 ...

  10. 微信小程序-wx:for 循环列表

      获取了 N 条信息(具体有多少条不确定),如何在界面中动态呈现出来呢? .wxml 代码 <view wx:for="{{items}}" wx:for-index=&q ...