-
Notifications
You must be signed in to change notification settings - Fork 0
/
Variable.html
109 lines (107 loc) · 4.28 KB
/
Variable.html
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Variable</title>
</head>
<body>
JS
变量包含两种数据类型:基本数据类型(保存在变量中的实际的值)、引用数据类型(保存在内存中的对象)。
<hr />
当复制保存着对象的某个变量时,操作的是对象的引用。但在为对象添加属性时,操作的是实际的对象。
<hr />
不能给基本类型的值添加属性,只能给引用类型值动态地添加属性。
</body>
<script>
// 如果从一个变量向另一个变量复制"基本类型"的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。
var s1 = 10;
var s2 = s1;
s1 = null;
console.log(s2);
/*
当从一个变量向另一个变量复制"引用类型"的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。
不同的是,这个值的副本实际上是一个"指针",而这个指针指向存储在堆中的一个"对象"。
复制操作结束后,两个变量实际上将"引用同一个对象"。
*/
var o1 = {
name: 'hahasha'
};
var o2 = o1;
o1.name = 'tinahure';
console.log(o2.name);
/*
ECMAScript 中所有函数的参数都是按'值'传递的。
基本类型值的传递如同基本类型变量的复制一样,引用类型值的传递,则如同引用类型变量的复制一样。
*/
function addNum(num) {
// 基本类型的传递
return num + 10;
}
function addProp(obj) {
obj.name = 'hahasha';
}
var sampleNum = 10,
sampleObj = {};
addNum(sampleNum);
addProp(sampleObj);
console.log(sampleNum);
console.log(sampleObj); // 因为变量的引用,下边的修改会影响这一步的输出结果
// 即使在函数内部修改了参数的值,原始的引用仍然保持未变。当在函数内部重写时,这个变量引用的就是一个局部对象了,局部对象会在函数执行完毕后立即被销毁。
function rewriteObj(obj) {
obj.name = 'vknight';
obj = new Object();
obj.name = 'wusawu';
}
rewriteObj(sampleObj);
console.log(sampleObj);
/*
检测基本数据类型
typeof variable
检测引用数据类型
variable instanceof constructor
*/
console.log(typeof []);
console.log([] instanceof Array);
/*
执行环境:变量或函数有权访问的其他数据,决定了它们各自的行为。
变量对象:每个执行环境都有一个与之关联的变量对象;环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境被认为是 window 对象,因此所有全局变量和函数都是作为 window 对象的属性和方法创建的。
作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链,保证对执行环境有权访问的所有变量和函数的有序访问。
延长作用域链:try-catch、with...
*/
if (true) {
var c1 = 'red';
}
console.log(c1);
if (true) {
let c2 = 'blue';
}
try {
console.log(c2);
} catch (error) {
console.log(error);
}
(function () {
var c3 = 'green';
})();
try {
console.log(c3);
} catch (error) {
console.log(error);
}
function getcx() {
var c1 = 'yellow';
return c1;
}
console.log(getcx());
/*
垃圾收集机制:标记清除、引用计数(跟踪记录每个值被引用的次数,循环引用易引发问题)...
当变量进入环境时,就将这个变量标记为'进入环境';当变量离开环境时,则将其标记为'离开环境'。
当这个值的引用次数变成 0 时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。
解除引用:一旦数据不再有用,最好通过将其值设置为 null 来释放其引用;局部变量会在它们离开执行环境时自动被解除引用。
*/
console.log('to be continued...');
</script>
</html>