javascript虽然还没有类的概念,他仍然有两种数据类型,原始基本类型和引用类型
原始类型的数据保存为简单值,交互时可以直接访问变量里的数值本身,五种基本类型
引用类型保存为对象,javascript不允许直接访问内存位置,所以不能直接访问到对象的内存位置,因此操作对象时是对该对象的引用进行操作
简单类型复制的时候会复制,分开存放
Apple1 = Apple2
而引用类型是复制时存放在variable object的值也会复制一份到新的变量中,但复制的值是指向堆里的原始对象,因此该对象变动会反应在其他引用里
var obj1 = new Object();
var obj2 = obj1;
obj1.name = “Nicholas”; alert(obj2.name); //”Nicholas”
javascript允许人们像使用引用类型一样使用原始类型,为了看起来保持一致性
其他语言把原始类型存放在栈(stack)里,而引用类型存放在堆(heap)里
javascript把变量放在一个变量对象里(variable object),原始类型直接存放在这个对象里面,而引用类型只是作为指针指向对象被存储的内存位置
函数里面的参数都是通过复制值到函数的local object来运算,因此传入是引用类型,那么复制的是对该对象的引用,即使在函数里操作也会影响该对象本身。而在函数内部创建的对象会被保存在本地对象,即使名字和外部传进来的参数一样,也不会相互影响,因为存储位置不同
每个运行上下文都有一个与之相关联的变量对象,该上下文里的所有变量和函数对在该对象上,这个对象是不能通过开发者代码访问到的
全局的运行上下文是最外层的,取决于宿主环境对ecmascript的实现,在浏览器里,指的是window对象。当一个运行上下文里的代码运行完之后,对应对象就会销毁,例如关闭浏览器,全局上下文被销毁
函数有自己的运行上下文,当代码调用函数,该函数的运行上下文就会加入运行上下文栈里,当函数执行完毕,栈就会释放,控制权归还给之前的运行上下文