js设计模式学习之面向对象的javascript(一)

本文主要探讨了在学习JavaScript过程中,如何通过研究设计模式来改进代码质量,避免常见编程问题。详细介绍了JavaScript的基本数据类型、对象类型、空类型和未定义类型的概念,以及函数参数传递的机制。通过实例分析了原始类型和引用类型参数传递的区别,揭示了JavaScript函数参数传递的本质。
声明:此学习笔记主要是学习《Pro JavaSript Design Patterns》(中文名:JavaScript设计模式)一书所写,另外参考《JavaScript高级程序设计》(第三版),接触javascript半年了,代码写多了却感觉越写越糟糕,因此想细心的研究下设计模式,因为不是一个很有耐心的人,对于一件事坚持不了多久,所以想了一个办法,申请了一个博客,希望能坚持记录学习点滴,督促自己把这件事继续下去。
 

javascript是弱类型的语言,定义变量时不必声明类型,但这并不意味着变量没有类型,一个变量可以属于几种类型之一,这取决于变量包含的数据。

javascript的三种原始类型:布尔型、数值型、字符串类型(不区分整数和浮点数是js与众多语言不同的特点之一)。
对象类型:一种复合的数据类型。(数组算是一种特殊的对象,它包含着一批值得有序集合)
空类型(null)和未定义类型(undefined)。
 
原始的数据类型是按值传送,其他数据类型是按引用传送的。
 
js函数的参数传递:ECMAScript中所有的函数的参数都是按值传递的,就是说把函数外部的值复制给函数内部的参数。
 
访问变量有按值和按引用两种方式,但是函数的参数传递只能按值传递。
 
下面举几个例子来验证上面这句话:
 
首先对于原始类型的传递:
 
var i=10;
function addself(i){
  i+=i;
  console.log(i);        //20
}
addself(i);
console.log(i);                //10
 
很明显对于原始类型的参数传递,与c、c++等语言都是类似的,下面我们看一下对象类型
 
var obj={
  name:"flyhorse"
};
function changeName(o){
  o.name="horse";
}
changeName(obj);
console.log(obj.name);        //horse
 
上面的例子似乎跟其他语言的引用类型的传递如出一辙,并不能证明js的函数对于引用类型也是按值传递的。
下面我们修改一下上方的例子:
 
var obj={    
       name:"flyhorse"
};
function changeName(o){
  o=new Object();
  o.name="fly";
  console.log(o.name);    //fly
};
changeobj(obj);
console.log(obj.name);        //flyhorse
 
如果说函数参数的引用类型是按址传递的话,那么上方的例子,我们将obj的地址传递给了o,在函数的内部我们重新创建了一个对象,并且将o指向这个对象,为对象添加了属性name为“fly”,函数执行完后,我们的全局的obj应该也会改变,name属相打印出应该是“fly”,但是为什么结果是打印出“flyhorse”呢?
我们再重新分析一下:我们将全局的obj对象的地址,传递函数的参数o,其实是我们将obj的地址,复制了一个副本给了参数o,而参数o呢,其实是函数内部的局部变量(或者说是函数的arguments对象的一个元素),如果能够理解o是函数内部的局部变量那么结果就很好理解了,我们在函数内部对于o变量的一切操作,会在函数作用域退出时被清理干净(当然也会将局部变量o清除干净),所以当函数执行完毕后,我们的全局的obj对象没有收到任何影响。
这样我们再来看第二个例子也就知晓了,我们将全局的obj对象的地址值,复制了一个副本传递给了函数的参数o(函数的局部变量),此时函数的局部变量o和全局变量obj引用的其实是堆里的同一个对象,而且还是全局的对象,此时我们通过变量o修改的全局对象的属性当然也会反映到全局中。
 
所以说我们并不能因为在局部作用域中修改的对象会在全局作用域中反应出来,就简单的认为参数是按照引用传递的。

转载于:https://www.cnblogs.com/flyhorse-jun/archive/2013/05/05/3060759.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值