《JavaScript高级程序设计》读书笔记4.1基本类型和引用类型的值

  • ECMAScript变量可能包含两种不同类型的值:基本类型值引用类型值
  • 基本类型值指简单的数据段,5种基本数据类型是按值访问,可以操作保存在变量中的实际值。
  • 引用类型值指那些可能由多个值构成的对象。按引用访问。引用类型的值是保存在内存中的对象。当复制保存着对象的变量时,操作的是对象的应用;为对象添加属性时,操作的是实际的对象。
  • JavaScript不允许直接访问内存中的位置,(所以分为栈内存和堆内存。)

1.动态的属性

只有引用类型值才能动态的添加属性

1
2
3
var person=new Object();
person.name="libowen";
alert(person.name); //"libowen"

2.复制变量值

基本类型值和引用类型值在复制时也不一样。
基本类型值的复制:创建一个该值的新副本,并把副本复制到新变量分配的空间中,两者完全独立,互不影响。

1
2
var num1=5;
var num2=num1;

复制前的变量对象
  |  
—|—
  |  
num1 | 5(Number类型)
复制后的变量对象
  |  
—|—
  |  
num2 | 5(Number类型)
num1 | 5(Number类型)

引用类型值的复制:创建一个该值的新副本,并把副本复制到新变量分配的空间中。但此副本实际上是一个==指针==,这个指针指向存储在堆中的一个对象。两个变量实际上引用同一个对象,改变其中一个变量,就会影响另一个变量。

1
2
3
4
var obj1=new Object();
var obj2=obj1;
obj1.name="libowen";
alert(obj2.name); //"libowen"

引用类型值复制

3.传递参数

ECMAScript中所有函数参数都是按值传递的。
为何访问变量有按值和按引用两种方式,而参数只能按值传递?
把函数的命名参数理解为局部变量,参数的传递就可以理解为复制变量值。复制变量值,两种类型都是按值传递,基本类型传递实际值,引用类型传递指针值。

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
向参数传递基本类型值
function addTen(num){
num+=10;
return num;
}
var count=20;
var result=addTen(count);
alert(count); //20,没有变化
alert(result); //30

向参数传递引用类型值
function setName(obj){
obj.name="libowen";
}
var person=new Object();
setName(person);
alert(person.name); //"libowen"

内部重写obj时,这个变量引用的是一个局部对象,在函数执行完后会立即销毁。
function setName(obj){
obj.name="libowen";
obj=new Object();
obj.name="Born";
}
var person=new Object();
setName(person);
alert(person.name); //"libowen"

4.检测类型

  • 基本类型的值用typeof操作符
  • 引用类型的值用instanceof操作符
liborn wechat
欢迎您扫一扫上面的微信二维码,订阅我的公众号!