一、变量

JS中变量的值分为两种:基本类型值 | 引用类型值

分别从动态的属性、复制变量值、传递参数、检测类型来理解

基本类型值:简单的数据段

1、动态赋值:我们不能给基本类型的值添加属性

var name = "kenzi";
	name.age = 22;
	alert (name.age);   
	// output: undefined

2、复制变量值:

var num1 = 5;
var num2 = num1;
//

num1中保存的值是5,num2中保存的值也是5,只是num1中的一个副本,这两个变量的内存空间是不同的,两个变量可以参与任何操作而不会相互影响

3、传递参数:js中所有函数的参数都是按值传递的。(没有按引用传递,引用传是指传地址)

function addTen(num) {
	num += 5;
	return num;
}
var count = 10;
var result = addTen(count);
alert (count);//output : 10,没有变化
alert (result);//output: 15

4、检测类型
typeof操作符可以确定一个变量是字符串、数值、布尔值,还是undefined的最佳工具。注意:当变量的值是对象或者null时,typeof操作符会返回 “object”

var s ="kenzi";
alert (typeof s);//string
var n = null;
alert (typeof n);//object
引用类型值:可能由多个值构成的对象,是保存在内存中的对象

注意:JavaScript不允许直接访问内存中的位置,即不能直接操作对象的内存空间

1、动态赋值:可以给引用类型值动态地添加属性

var person = new Object();
person.name = "kenzi";
alert(person.name);// "kenzi"

如果对象不被销毁或者这个属性不被删除,则这个属性将一直存在

2、复制变量值:

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "kenzi";
alert(obj2.name);  // "kenzi"

首先,变量obj1保存了一个对象地新实例,然后,这个值被复制到了obj2中;obj1和obj2都指向同一个对象。当obj1添加name属性后,可以通过obj2来访问这个属性,因为这两个变量引用地都是同一个对象。

3、传递参数:

function setName ( obj ) {
Obj.name = "Kenzi" ;
}
var person = new Object () ;
setName ( person );
alert ( person.name ) ;  //"kenzi"

创建了一个对象,并将其保存在了变量person中,然后,这个对象被传递到setName()函数中之后就被复制给了obj。在这个函数的内部,obj和person引用的是通一个对象

4、检测类型

不是想知道某个值是对象,而是想知道它是什么类型的对象时,用instanceof操作符

alert ( person instanceof Object);
alert ( color instanceof Array);
alert ( pattern instanceof RegExp);

二、执行环境及作用域

每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

每个函数都有自己的执行环境,当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。

如果这个环境是函数,即变量对象是活动对象,活动对象在最开始时只包含一个变量,即arguments对象(这个对象在全局环境中是不存在的)。
作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样一直延续到全局执行环境(window对象);全局执行环境的对象始终都是作用域链中的最后一个对象

执行时是从内往外执行,不能从外往内来看的,搜索到就执行,不再往外再搜索

三、垃圾收集

大多数浏览器采用 标记清除引用计数已经不用了,会出错

//参考《JavaScript高级程序设计》第3版