基本类型值——栈内存 完全保存在内存中的一个位置 按顺序访问
引用类型值——堆内存 变量中保存的实际上是一个指针 无需按顺序访问
5中基本数据类型:Undefined、null、boolean、number和string 栈中,按值访问,因而我们操作的是它们实际保存的值
引用类型值的大小不固定,但内存地址的大小是固定的,因而将内存地址保存在栈中,实际值在堆中。按引用访问。
1. 动态属性 引用类型可以动态添加属性,基本类型不行二者差异:
2. 复制变量 复制的都是栈中的,
基本类型——副本,互不影响
引用类型——在栈中复制新值,保存内存地址
3. 传递参数——js中函数只有按值传参,对父本没有影响,针对引用类型,也是按值传参,只不过传的是栈中的值(保存内存地址),由于obj、person所指的地址是相同的,所以对obj的操作,就会改变实际堆中的值。
function setName(obj){ obj.name = "Nichlas"; obj = new Object(); obj.name = "Greg"; } var person = new Pbject(); setName(person); alert(person.name); //"Nichloas"
note:阴影部分指的是
obj = new Object(); obj.name = "Greg";
4.检测类型——typeof() , instanceof
1 var s = "Nicholas"; 2 var b = true; 3 var i = 22; 4 var u; 5 var n = null; 6 var o = new Object(); 7 8 alert(typeof s); //string 9 alert(typeof i); //number 10 alert(typeof b); //boolean 11 alert(typeof u); //undefined 12 alert(typeof n); //object 13 alert(typeof o); //object
根据规定,所有引用类型的值都是Object的实例,所以检测引用类型值和Object构造函数是,instanceof始终返回true。