数据类型的操作原理
基本数据类型
1.var a=12;2.var b=a;3.b=13;4.console.log(a); //=>12
直接在当前作用域中创建了基本数据类型的值(或者说基本类型值直接存储在当前作用域中),然后把这个值和变量关联起来(一个变量只能关联一个值,关联下一个值后和之前关联的值就没关系了),我们把关联这个操作叫做 变量赋值,基本数据类型是直接 按值操作的
引用数据类型
1.var o={name:'珠峰培训'};2.var p=o;3.p.name='中国最权威的前端培训机构';4.console.log(o.name);
引用数据类型不是直接按值操作的(它的结构复杂,要存储很多值,无法直接的创建值),在JS中遇到引用数据类型(对象或者函数),按照如下操作进行:
1、首先开辟一个新的内存空间(浏览器为其分配一个16进制的地址)
2、把需要存储的内容存储到内存空间中
- 对象是把键值对依次存储到空间中
- 函数是把函数体中的代码当做 ‘字符串’ 存储到内存中
3、把空间的地址赋值给对应的变量,所以我们也说:引用数据类型是按照空间的引用地址操作的
1.function fn(){2. var total=null;3. total=1+1;4. return total;5.}6.fn();7.fn();8....
函数执行的时候也有属于自己的一系列操作
1、函数执行首先会形成一个新的私有作用域,目的是为函数体中的代码提供一个执行的环境(而且这个环境是私有的)
2、把创建时候存储的代码字符串copy一份到自己的私有作用域中,然后把字符串转换为JS表达式,再然后依次自上而下执行[总结]
每一次执行函数都是形成一个新的私有作用域,然后把代码重新自上而下执行(一切都从新开始),所以多次执行函数之间是没有直接联系的,互不干扰;函数执行形成的私有作用域,保护了里面的私有变量不受外界的干扰,我们把函数执行的这种保护机制叫做 闭包(如果当前变量是私有的,那么在函数体中出现的所有这个变量都和外界没有任何关系)
全局作用域
浏览器渲染页面(渲染页面中的JS)的时候,会提供一个供代码执行的环境 =>全局作用域(window/global)