最近在重读《javascript高级程序设计》这本书,“温故而知新”,古人诚不欺我,再看的时候发现不少知识是以前不理解便跳过的,也有不少以前只是知道并记住了,并不能造成一套体系,而不断的回顾,不断地总结,我发现有不少零零散散的知识点在不经意间就被串在了一块儿,恍然大悟的感受甚是美妙javascript
而我一贯喜欢思惟导图和记忆的方式去学习总结,在用文字表达和总结方面显得很贫乏,因此打算用这种博客的形式来记录下重读过程当中的总结,就当是记个笔记,也顺便练练表达能力java
变量:es6
js中的变量可能包含两种不一样数据类型的值:分为基本类型值和引用类型值。二者区分的本质是取决于变量在内存中的存储方式,基本类型值存放在栈内存中,引用类型值保存在堆内存中。浏览器
而因为两种类型的保存方式不一样,咱们在复制变量值的时候就会发现:对基本类型值的复制是值复制,复制后的变量值与变量值只是数据相同并且,在内存中是独立的;对引用类型值的复制是其实也是“值”复制,不过这个值是一个指针,而咱们真正会操做的数据是指针指向的一个内存,咱们复制的那个指针“值”只是一个指向真正数据内存的地址,也就是咱们常说的引用,因此,在引用类型的复制中,最终复制后的变量与复制前的变量指向同一数据,因此对其中任何一个变量进行改变都会影响另一个函数
目前简单数据类型有:Undefined,Null,String,Number,Boolean,Symbol(es6新增数据类型)学习
复杂数据类型:Objectspa
而对简单数据类型,一般用typeof来判断,其返回值有:“undefined”,“string”,“number”,“boolean”,“symbol”,“function”,“object”而typeof null == “object”,是由于历史遗留问题,而自己null也表示“该变量为一个空的指针”,因此,其typeof的结果为“object”也能够理解了设计
而对复杂数据类型,一般使用instanceof来判断,表示是不是该对象的实例对象,经过原型链(暂不作讨论)来判断指针
而对一些特殊的数据类型,咱们也有对应的方法判断其类型:数据的Array.isArray,非数字的isNaN对象
执行环境与做用域:
首先,明确几个知识点:1)每一个函数都有本身的执行环境 2)执行环境定义了变量或函数有权访问的其余数据 3)每一个执行环境都有一个与之关联的变量对象,执行环境中定义的全部变量和函数都保存在这个对象中
对以上三点我所理解的就是:每一个函数在内存中都有一个与之关联的对象,该对象中保存了这个函数内部定义的变量,方法等一切信息,是对这个函数的一个描述对象
而当函数执行时,函数的执行环境会被推入到一个环境栈中,此时会造成与其余执行环境的一种“包含”或者“平行”的关系,而这种“包含”的体现就是“做用域链”,更严谨的说法是:当代码再一个环境中执行时,会建立变量对象的一个做用域链。而做用域链的做用就很牛逼了,咱们常常说的变量查找从局部做用域到外层再到外层直至全局做用域就是依靠这条做用域链。做用域链只能向上查找。
内存问题:
js的垃圾回收机制使得执行环境会管理代码执行过程当中使用的内存,而按照咱们对执行环境和做用域的理解,咱们知道,代码执行结束后,执行环境被从环境栈中推出,此时执行环境中的局部变量也就没有存在的意义了,因此,此时须要告知该执行环境中的局部变量应该被回收,而具体的回收策略在浏览器中有:
1:标记清除:变量的标记从“进入执行环境”到“离开执行环境”,回收机制只要清除那些标有“离开”的变量便可
2:引用计数:当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数加1,若是同一个值又被赋给另一个变量,则减1,回收机制负责回收引用次数为0的值。可是这种方法遇到循环引用时,便会陷入僵局,因此,该方法使用场景较少
越写越乱的感受,表达能力仍是太欠缺了,还须要多练习,对知识也要深刻理解,加油!!!