JS中变量有两种数据类型值,基本类型的值和引用类型的值。基本类型就是null,undefined,Boolean,string,number,引用类型的值都是对对象的引用,即一个指向对象的指针。
引用类型为一种数据结构(其他语言中称为类,js中之前没有类的概念,在es6中有了(一个语法糖)),当其具体化的时候,就成为了对象,所以对象称为引用类型的实例或值。(对象即键值对构成的组合。)
变量 = 标识符 + 值(保存在栈中)
1.引用类型的理解
通俗来讲,引用类型就是一个模板,里面定义了初始的数据与方法,而对象就是使用这个模板构建出来的东西。
比如下面的代码。
function creatPerson(){ var obj = new Object(); obj.name = "wangbadan"; obj.age = "18"; obj.sex = "undefined"; return obj; }
调用这个函数,就会创造出一个定义了基本的名字等信息的对象,这个函数就是一个模板。
引用类型的变量的值为指针,当你使用var obj = new Object()时,obj这个变量中的值存
储的是什么呢?就是指向新产生的对象的指针。当使用new Object()在堆空间里面创建一个对象,obj变量的值为
保存在栈中的指针,指向堆中的对象。(js操作不能直接访问内存空间)
这样一来,对于函数参数是传值就好理解了。看下面一段代码。
1 var initObj = new Object(); 2 (function (obj){ 3 obj.name = "dashazi"; 4 })(initObj); 5 alert(initObj.name); //dashazi
传入函数的,就是initObj的值,即指向内存中新产生的对象的指针。函数内部根据传入的指针访问到对象,给对象
增加了name属性。之后输出initObj,就会访问相同对象,查找到name属性,于是输出dashazi。
2.引用类型变量的赋值
1.引用类型变量间的赋值
其实函数参数传值是一个道理,假如a,b是两个引用类型的变量,那么a = b,b的值就是地址,把b指向的对象的地址传给a,对a进行操作时不涉及更换指向的操作时,就是对原本b指向的对象进行操作。(学过指针的应该能明白)
2.给引用类型赋其他值
比如a原本指向对象A,现在a=B,那么不会改变A的任何东西,只是更换了指向。同理,其他基础类型的值也是一样,改变指针指向的地址而已。
变量 = 标识符 + 值(保存在栈中的地址)
ps:js是一种弱类型的语言,在解析器进行解析时,会根据等式右边的类型进行猜测需要进行使用什么样的二进制的操作。
理解了上面的内容,结合指针的知识,从js实现原理(编译原理)的角度看,只需按正常的逻辑推理就能知道引用类型变量的赋值机制。