JavaScript 从做为浏览器上唯一的开发语言,到近期 html5 以及 Node.js 等后端技术的兴起,其发展势头已经不可限量,笔者刚开始接触 JavaScript 之时并未对其足够重视,眼前在使用 Node.js 的时候产生很多问题,查询资料后发现很多基础问题并未厘清,遂决定重学之,本文是笔者重学 JavaScript 的笔记之一。
JavaScript 中的变量有 5 个基本数据类型(Undefined, Null, Boolean, Number, String)和引用数据类型(Object,注:笔者这里把 Function,Array 等类型都暂时归于 Object 类型)。
类型 | 可能的值 |
---|---|
Undefined | 只有 undefined,比如:var message; alert(message == undefined)//true |
Null | 只有 null |
Boolean | true 和 false |
Number | 整数或者浮点数,例如:1 或者 3.14e10 |
String | 任何字符串,例如:var a = "string" |
基本类型和引用类型的变量声明方式是一样的:
- // 声明一个String类型的变量var str = "string";// 声明一个引用类型的变量,并添加属性var person = new Object();person.name = "Jeremy";
二者的区别主要在于对变量内容保存的方式,基本类型的变量中存储的就是简单的数据段,而引用类型变量存储的是指向对象的引用,比如:
- // 基本类型的变量复制,可以看出基本类型变量存储的就是变量的值var num1 = 1;var num2 = num1;console.log(num2); //1// 引用类型的变量复制,可以看出引用变量中存储的是指向对象的引用// Object对象存储于堆中,而obj1和obj2分别存储了指向此Object对象的引用var obj1 = new Object();obj1.name = "Jeremy";var obj2 = obj1;obj2.name = "James";console.log(obj1.name); //James
在 JavaScript 中无论是基本类型还是引用类型,函数参数都是按值传递的,先来看基本类型:
- function test(num) {
- num += 10;
- return num;
- }
- var num = 10;
- var res = test(num);
- console.log(num); //10 外部变量并未受到影响console.log(res); //20
接下来看引用类型:
- function setName(obj) {
- obj.name = "James";
- }
- var person = new Object();
- person.name = "Jeremy";
- setName(person);
- console.log(person.name); //James 影响到了外部引用变量
乍一看,这不就是按引用传递吗?怎么会是按值传递呢?之所以是按值传递是因为当调用 setName(person) 的时候,实际上是把 person 所指向的对象的引用进行了复制,然后传递给了 setName 函数,这样在函数 setName 内部对此引用进行操作时候是会影响到此引用所指向的对象,即外部 person 所指向的对象。
总的来说,基本类型的参数传递复制的是具体的值,而引用类型的参数传递复制的是这个引用变量存储的对对象的引用。
为了进一步证明引用类型的参数传递是按值传递而不是按引用传递的,请看:
- function setName(obj) {
- obj.name = "James";
- obj = new Object();
- obj.name = "Leon"
- }
- var person = new Object();
- person.name = "Jeremy";
- setName(person);
- console.log(person.name); //James
以上代码输出的是 James,如果是按引用传递,那么以上代码输出的是 Leon。实际上,当执行
的时候,引用所指向的对象的值已经发生了改变,当在对 obj 进行覆盖的时候,obj 的值是一个指向局部对象的引用,而这个引用无法对外部的对象产生影响,并且此对象会在函数执行结束之后销毁。
- obj.name = "James"
参考:《JavaScript 高级程序设计第三版》
(完)
来源: http://it.taocms.org/10/1853.htm