JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性

说明(2017-4-2 18:27:11):

1. 作为函数的参数,就是将函数的数据拷贝一份,传递给函数的定义中的参数。

  函数foo()在调用的时候,做了两件事:

  (1)函数在调用的时候,首先需要将参数中的数据拷贝一份,即数字123拷贝一份。

  (2)跳转到函数的定义中(函数体),在此之前完成了函数的赋值,即num=123。

  (3)正式的进入函数内,准备执行函数的每一句话。

1     function foo(num){}
2     var a = 123;
3     foo(a);

2. 值类型作为函数参数传递的特征,函数内与函数外是两个不同的变量,仅仅是值相等而已。

3. 引用类型作为函数参数传递的特征,函数内与函数外是两个不同的变量,但是指向同一个对象。

  *因此在函数内部允许修改函数外部的对象的数据。

  例1:因为没有先定义p1,所以不存在p1这个对象。报错:不能设置“未定义”的name属性。

 1 <script type="text/javascript">
 2     var o = {name: "张三", age: 19, gender: "男"};
 3     // copy拷贝的第二种方法,带参数(第一种方法是return返回值)
 4     o.copy = function(obj){
 5         for(var k in this){
 6             obj[k] = this[k];
 7         }
 8     };
 9     var p1;
10     o.copy(p1);
11 </script>

  例2:copy函数里,设置了obj = {}。不报错,但watch里面先是仍然是未定义。因为obj已经重新指向了{}这个空对象,已经跟p1没有关系了,所以可以成功把name等属性赋值给obj,所以不报错(只不过函数运行完,函数里面的数据没有被引用着,这些数据就会被删除,释放内存)。但p1仍然是undefined。

 1 <script type="text/javascript">
 2     var o = {name: "张三", age: 19, gender: "男"};
 3     // copy拷贝的第二种方法,带参数(第一种方法是return返回值)
 4     o.copy = function(obj){
 5         // 此处设置obj等于一个空对象,天坑!!!
 6         var obj = {};
 7         for(var k in this){
 8             obj[k] = this[k];
 9         }
10     };
11     var p1;
12     o.copy(p1);
13 </script>

  例3:正确做法,直接在外面声明p1位一个空对象。这样参数obj也指向了同一个空对象,只要obj改变了,p1也随之改变。

 1 <script type="text/javascript">
 2     var o = {name: "张三", age: 19, gender: "男"};
 3     // copy拷贝的第二种方法,带参数(第一种方法是return返回值)
 4     o.copy = function(obj){
 5         for(var k in this){
 6             obj[k] = this[k];
 7         }
 8     };
 9     // 正确做法,直接在外面声明p1位一个空对象。
10     var p1 = {};
11     o.copy(p1);
12 </script>

总结:

函数的参数,其实就是一个赋值过程,只不过“赋值”是直接赋值,而“参数”是隐形赋值看不见。

时间: 2024-10-07 05:24:55

JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性的相关文章

JavaScript高级程序设计之引用类型(下)

此篇内容紧接<JavaScript高级程序设计之引用类型(上)>,下边继续开始: Date类型 Date是一个日期类,用它可以来获取日期和时间以及指定日期的毫秒数.Date类提供了丰富的API,可以通过MDN上的文档来了解:点击这里跳到MDN,这里便不详细阐述了. RegExp类型 正则表达式绝对是编程语言中的一把利器,无使而不利,在日常编码中会经常用正则来匹配一些东西.JS中的正则,可以通过两种方式来创建:字面量形式和实例化构造函数方式.需要注意的是,字面量创建的正则,会共享一个实例,实例化

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

实现带参数.返回值类型声明的js函数: 类型定义:window.Str = Type.Str = Type.define('STRING', Type.isStr);var Per = Type.define('PERSON', function(p){    return p && p.type === 'person' && p.name;}); 定义函数:var addStr = Str(function(a, b){  return a + b;}, Str, St

JavaScript高级程序设计之引用类型(上)

引用类型是比较复杂的一种类型.在面向对象的编程中,会经常用到引用类型,可以说它是编程语言的核心.在JS中内置了几种引用类型,下边会进行一一的介绍. 内置引用类型 Object类型 1.声明方式:直接使用new操作符(const Data = new Object())和使用对象字面量(const Data = {})两种方式.使用对象字面量方式声明的话,花括号内可以写属性和方法,也可以什么都不写.需要注意的是虽然什么都不写,但对象并不是空对象,它会包含一些默认的属性和方法. 2.访问值:可以使用

C# 数据类型 数组,引用类型 值类型

1 /*C#语法基础 2 * 1.C#程序是从Main方法开始执行.要求Main方法的返回值类型为void或int ,而且要么不带参数,要么接受一个字符串数组作为参数.当返回值是int的是状态吗,标志程序是否执行成功,返回非 3 * 0值通常意味着错误: 4 * 2.类型:是具有相似特征和行为的个体的分类: 5 * 3.一次赋值返回一个值,所以C#允许在同一条语句中连续进行多个赋值操作: 6 * 4.基元类型:8中整数类型,2种二进制浮点类型,1种金融计算的额十进制浮点类型,1种布尔类型,1种字

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

说明(2017.3.28): 1. JavaScript是一种基于对象的多范式编程语言,不是面向对象,但离开对象不能活. 范式编程是指编程习惯.方式,分为过程式.对象式和函数式编程. 2. 面向对象是指,使用对象进行开发,面向对象是对面向过程的封装. 3. JavaScript面向对象的三个特点,抽象性.继承性和封装性. 抽象性是指,抽取出核心属性和方法,不在特定条件下不能确定对象的具体意义. 继承性是指,把我没有的属性和方法拿来使用,并变成自己的属性和方法. 封装性是指,把方法和属性打包成一个

JavaScript高级 面向对象的程序设计 (二)

二.继承 OO是面向对象语言最为有魅力的概念.一般的OO语言都实现了两种继承,接口继承和实现继承.接口继承只继承方法签名,而实际继承继承了实际的方法. 而在JS中,函数没有签名,所以无法实现接口继承.只能依靠原型链--实现继承. 2.1原型链 JS中描述了原型链的概念,并利用原型链作为实现继承的主要方法. 其基本思想:利用原型链让一个引用类型继承另一个引用类型的属性和方法. functionSuperF(){ this.superPropty ='B'; } SuperF.prototype.g

SpringMVC 返回值类型,参数传递 解决乱码

一.SpringMV返回值类型 返回String类型时: 返回Object类型时: 传递参数 域属性传递: 处理器映射器 原文地址:https://www.cnblogs.com/qinzhenyu/p/11825965.html

JavaScript高级 面向对象(13)--构造函数的执行过程

说明(2017-4-2 21:50:45) 一.构造函数是干什么用的: 1. 初始化数据的. 2. 在js给对象添加属性用的,初始化属性值用. 二.创建对象的过程: 1. 代码:var p = new Person(); 2. 首先运算符new创建了一个对象,它类似于{},是一个"没有任何成员"的对象. * 使用new创建对象,对象的类型就是创建它的构造函数名(如,Person类型). * 使用{}无论如何都是Object类型,相当于"new Object()".

JavaScript高级程序设计12.pdf

第六章 面向对象的程序设计 ECMA中有两种属性:数据属性和访问器属性 数据属性的特性 [[Configurable]] 表示是否通过delete删除属性,是否重新定义属性,是否能把属性修改为访问器属性 [[Enumerable]] 表示是否通过for-in循环返回属性 [[writable]] 表示是否修改属性的值 [[Value]] 包含这个属性的数据值,从这个属性里读取数据值 要修改属性默认的特效必须使用ECMAScript 5的Object.defineProperty()方法,它接收3