一、变量
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版