4.1 基本数据类型和引用数据类型
5种基本数据类型:
Undefined
Null
Boolean
Number
String
1.动态的属性
var person = new Object();
person.name = "Nicholas";
alert(person.name);//"Nicholas"
但是如果通过下面的方式来创建就不可以动态的访问属性
var name = "Nicholas";
name.age = 27;
alert(name.age);//undefined
2.复制变量
var num1 = 5;
var num2 = num1;
这两个变量可以参与任何操作而不会相互影响。
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
obj1 和 obj2 都指向同一个对象。
3.传递参数
基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。
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 = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name);//"Nicholas"
4.检测类型
typeof 操作符是确定一个变量是字符串、数值、布尔值,还是 undefined 的最佳工具。
var n = null;
var o = new Object();
alert(typeof n); //object
alert(typeof o); //object
想知道它是什么类型的对象,则通过instanceof方法:
result = variable instanceof constructor
如果变量是给定引用类型(根据它的原型链来识别;第 6 章将介绍原型链)的实例,那么instanceof 操作符就会返回 true
4.2 执行环境及作用域
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
// 这里可以访问 color、anotherColor 和tempColor
}
// 这里可以访问 color 和 anotherColor,但不能访问tempColor
swapColors();
}
// 这里只能访问 color
changeColor();
1.延长作用域链
try-catch 语句中的catch块
with语句
2.没有块级作用域
for语句中的变量声明会将变量添加到当前的执行环境(在这里是全局环境)中。
for (var i=0; i < 10; i++){
doSomething(i);
}
alert(i); //10
1.声明变量
function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
var result = add(10, 20); //30
alert(sum);//由于 sum 不是有效的变量,因此会导致错误
但是将上面的代码修改以下
function add(num1, num2) {
sum = num1 + num2;
return sum;
}
var result = add(10, 20); //30
alert(sum);//30
4.3垃圾收集
JavaScript 具有自动垃圾收集机制,找出那些不再继续使用的变
量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作。
4.4小结
基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;
引用类型的值是对象,保存在堆内存中;
包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;