说明(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. nginx 安装SSL安全证书

    安装证书 文件说明: 1. 证书文件214051493730988.pem,包含两段内容,请不要删除任何一段内容. 2. 如果是证书系统创建的CSR,还包含:证书私钥文件214051493730988 ...

  2. maven最全教程

    Maven 教程 1.Maven概述 Maven 是什么? Maven 是一个项目管理和整合工具.Maven 为开发者提供了一套完整的构建生命周期框架.开发团队几乎不用花多少时间就能够自动完成工程的基 ...

  3. 【C语言】练习2-1

     题目来源:<The C programming language>中的习题P27  练习2-1: 编写一个程序以确定分别由signed及unsigned限定的char.short.int ...

  4. API接口规范

    协议 API与用户的通信协议,总是使用HTTPs协议,确保交互数据的传输安全. 域名 应该尽量将API部署在专用域名之下. https://api.example.com 如果确定API很简单,不会有 ...

  5. perl进程管理一例

    #!/usr/bin/perl -w use strict; use warnings; use DBI; #### # 这里进行服务器任务管理 ## #字符串映射函数 our %actions = ...

  6. Android Studio 遇到 No Debuggable Applications 的解决方案

    一.在菜单的Tools -> Android -> 勾选 Enable ADB Integration 二.在工程的build.gradle(Module:app)里加上一行代码

  7. please verify the preference field with the prompt:Tomcat JDK name

    使用MyEclipse的Tomcat的时候出现下面的问题: a   configuration   error   occurred   during   startup.   please   ve ...

  8. Kafka不只是个消息系统

    作者丨 Jay Kreps Confluent 联合创始人兼 CEO Jay Kreps 发表了一篇博文,给出了 Kafka 的真正定位——它不只是个消息系统,它还是个存储系统,而它的终极目标是要让流 ...

  9. mvc 文件压缩 减少文件大小

    using System; using System.Collections.Generic; using System.IO.Compression; using System.Linq; usin ...

  10. Openssl aes加解密例程

    原文链接: http://blog.csdn.net/itmes/article/details/7714854 假设我们已经下载了 openssl的源码,并成功编译,设置好了编程环境. 我们现在来看 ...