1.在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。
2.当从一个变量向另一个变量复制引用类型的值时,两个变量实际上将引用同一个对象,因此,改变其中一个变量,就会影响另一个变量。
var obj1 = new Object();var obj2 = obj1;obj1.name = "Nicholas";alert(obj2.name); //"Nicholas"
3.访问变量有按值和按引用两种方式,而参数只能按值传递;
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,即命名参数;
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部;
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;
alert(colors instanceof Array);
5.JavaScript没有块级作用域,也就是for循环、if语句等{}并不会拥有自己的作用域,所以在这些语句中定义的变量,在外部执行环境中也是可以被访问的。
for (var i=0; i < 10; i++){ doSomething(i);}alert(i); //10
6.“标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然
后再回收其内存