JavaScript中的值传递和地址传递(引用传递)

简单类型和复杂类型

我们先来理清一下几种数据类型。原始的数据类型就有: number,string,boolean,undefined, null,object。进一步划分为值类型和引用类型。

值类型:简单数据类型,基本数据类型,在存储时,变量中存储的是值本身,因此叫做值类型。

引用类型:复杂数据类型,在存储时,变量中存储的仅仅是地址(引用),因此叫做引用数据类型。

1、基本类型(又称简单类型、值类型): number,string,boolean

2、复杂类型(引用类型):object

3、空类型:undefined,null

值类型的值在哪一块空间中存储? 栈中存储

引用类型的值在哪一块空间中存储?对象在堆上存储,地址在栈上存储。

var num=10;//值类型,值在栈上

var obj={};//复杂类型,对象在堆,地址(引用)在栈

值类型之间传递,传递的是值

引用类型之间传递,传递的是地址(引用)

值类型作为函数的参数,传递的是值

引用类型作为函数的参数,传递的是地址

数据类型在内存中的存储

堆和栈

  • 堆和栈

    1
    2
    3
    堆栈空间分配区别:
      1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
      2、堆(操作系统): 存储复杂类型(对象),一般由程序员分配释放, 若程序员不释放,由垃圾回收机制回收,分配方式倒是类似于链表。
  • 注意:JavaScript中没有堆和栈的概念,此处我们用堆和栈来讲解,目的方便理解和方便以后的学习。

基本类型在内存中的存储

复杂类型在内存中的存储

基本类型作为函数的参数

复杂类型作为函数的参数

例题练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 下面代码输出的结果
function Person(name,age,salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
function f1(person) {
person.name = "ls";
person = new Person("aa",18,10);
}

var p = new Person("zs",18,1000);
console.log(p.name);//zs
f1(p);
console.log(p.name);//ls

答案:

思考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//1. 
var num1 = 10;
var num2 = num1;
num1 = 20;
console.log(num1);
console.log(num2);

//2.
var num = 50;
function f1(num) {
num = 60;
console.log(num);
}
f1(num);
console.log(num);

//3. 重点
var num1 = 55;
var num2 = 66;
function f1(num, num1) {
num = 100;
num1 = 100;
num2 = 100;//注意是隐式全局变量
console.log(num);
console.log(num1);
console.log(num2);
}

f1(num1, num2);
console.log(num1);
console.log(num2);
console.log(num);

答案:

1、

2、

3、