一:基本类型和引用类型的值
ECMAScript变量包含两种不同数据类型的值:基本类型值和引用类型的值。
- 基本类型值 –> 简单的数据段
*5种基本数据类型是按值访问的,因为可以操作保存在变量的实际值。
*不能给基本类型的值添加属性。
*复制值会新创建一个新值,两个变量是完全独立的。
*确定一个值是哪种基本类型可以使用typeof操作符 - 引用类型值 –> 可能由多个值构成的对象
*引用类型的值保存在内存中的对象。js不允许直接访问内存中的位置即不能直接操作对象的内存空间,实际操作的是操作对象的引用而不是实际对象。因此是按引用访问的。
*能给引用类型值动态的添加属性和方法。
*虽然还是会创建一个新变量并分配空间,但是这个值实际只是一个指针,而这个指针指向存储在堆内存中的一个对象,即引用同一个对象。
*确定一个值是i哪种引用类型可以使用instanceof操作符。
二:传递参数
ECMAScript中所有的参数都是按值传递的。
function add(num) { //被传递的值会复制给一个局部变量
num += 10;
return num;
}
var count = 20;
var result = add(count);
alert(count); //20,没有变化
alert(result); //30
function setName(obj) {
obj.name = "Grace";
obj = new Object(); //即使在函数内部修改了参数的值但原始的引用未改变。实际上是该引用指向了一个局部变量而且这局部变量在函数执行完毕后立即被销毁
obj.name = "Lily";
}
var person = new Object();
setName(person);
alert(person.name); //Grace
三:执行环境
*每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
*全局执行环境默认为window对象。
*某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。
*当代码在一个环境中执行时会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量个函数的有序访问。活动对象最开始只包含一个arguments对象(这个对象在全局对象中不存在),再下一个包含环境,一直延续到全局执行环境。
四:作用域
js没有块级作用域的概念,即不是花括号封闭的代码都有自己的作用域
if(true) { //if语句中变量声明会将变量添加带当前的执行环境中,for语句初始化定义的变量也一样
var color = "red";
}
alert(color); //red