1.在操做对象时,其实是在操做对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。算法
2.当从一个变量向另外一个变量复制引用类型的值时,两个变量实际上将引用同一个对象,所以,改变其中一个变量,就会影响另外一个变量。函数
var obj1 = new Object(); var obj2 = obj1; obj1.name = "Nicholas"; alert(obj2.name); //"Nicholas"
3.访问变量有按值和按引用两种方式,而参数只能按值传递;
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,即命名参数;
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,所以这个局部变量的变化会反映在函数的外部;code
function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); setName(person); alert(person.name); //"Nicholas"
上面实例代码,person变量将内存地址做为值传递给setName参数。第一次给obj变量添加name属性是在person对象的内存地址基础上添加,以后从新赋新对象给obj变量,该对象为局部对象,内存地址与person对象并不相同,因此第二次添加name属性并不会影响person属性。也证实了参数传递方式为按值传递。对象
4.检测基本数据类型能够使用typeof;检测引用类型使用instanceof;ip
alert(colors instanceof Array);
5.JavaScript没有块级做用域,也就是for循环、if语句等{}并不会拥有本身的做用域,因此在这些语句中定义的变量,在外部执行环境中也是能够被访问的。内存
for (var i=0; i < 10; i++){ doSomething(i); } alert(i); //10
6.“标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然
后再回收其内存作用域