理解基本类型和引用类型的值,理解执行环境,理解垃圾收集
基本类型
:简单的数据段,引用类型
:指可能由多个值构成的对象(在将一个值赋值的时候,解析器必须知道这个值是基本类型值还是引用类型值)在基本类型中
var num1=5;
var num2=num1;
其中num1和num2是完全独立的,各自都占用内存js var obj1=new Object(); var obj2=obj1; obj1.name="xiaoh" alert(obj2.name) //xiaoh
当传递值基本类型的值时,被传递的值被复制了一份给局部变量(参数)
function addTen(num){
num+=10;
return num;
}
var count=20;
var result=addTen(count);
alert(count); //20 ,没有变化
alert(result); //30
当传递引用类型的值时,会把这个值在内存中的地址复制一个给局部变量(参数)
function serName(obj){
obj.name="xiaoming"
}
var person = new Object();
setName(person);
alert(person.name); //"xiaoming"
==================================
function setName(obj){ //此时obj只得到了索引
obj.name = "xiaohuang"; // .属性 ,改变了对象的值
obj=new Object(); //obj得到了新对象的索引,不再指向原来的对象
obj.name ="greg" //改变的是索引指向的新对象的属性
}
var person=new Object();
setName(person);
console.log(person.name); //小黄
console.log(obj.name)
在检测数据类型的时候,typeof是非常得力的助手,但是引用类型的时候,我们经常并不是想知道他是不是对象,更多的想知道他是什么类型的对象。此时就有了instanceof操作符
var name = "global";
function super() {
var name = "super";
function sub(){
var name = "sub";
}
}
当前作用域链:全局变量对象window -> 变量对象super —> 活动对象sub (从最底端向上访问)用伪代码案例来演示官方说明:
var a = new obj1 (obj1引用1)
var b=a (obj1引用2)
b = c(c指其他值 ,obj1引用-1)
a= c( obj1引用-1)
//此时obj1引用为0,已经没有变量能访问这个值了,则清除回收
引用标记的致命缺陷:循环引用,你的属性引用我,我的属性引用你。这样双方的引用次数都为2,永远不会被清除
原文:https://www.cnblogs.com/JCDXH/p/11609866.html