美文网首页
JavaScript高程读书笔记(3)

JavaScript高程读书笔记(3)

作者: 小懒豆 | 来源:发表于2018-03-31 19:10 被阅读9次

八、垃圾回收

找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

标记清除

当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记(闭包)。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾回收器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。

引用计数

含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为0的值所占用的内存。 Netscape Navigator3是最早使用引用计数策略的浏览器,但很快它就遇到一个严重的问题:循环引用。循环引用指的是对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的引用。

性能问题 =>什么时候触发垃圾回收?

window.CollectGarbage()方法会立即执行垃圾收集。

垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考的问题。IE6的垃圾回收是根据内存分配量运行的,当环境中存在256个变量、4096个对象、64k的字符串任意一种情况的时候就会触发垃圾回收器工作,看起来很科学,不用按一段时间就调用一次,有时候会没必要,这样按需调用不是很好吗?但是如果环境中就是有这么多变量等一直存在,现在脚本如此复杂,很正常,那么结果就是垃圾回收器一直在工作,这样浏览器就没法儿玩儿了。

微软在IE7中做了调整,触发条件不再是固定的,而是动态修改的,初始值和IE6相同,如果垃圾回收器回收的内存分配量低于程序占用内存的15%,说明大部分内存不可被回收,设的垃圾回收触发条件过于敏感,这时候把临街条件翻倍,如果回收的内存高于85%,说明大部分内存早就该清理了,这时候把触发条件置回。这样就使垃圾回收工作职能了很多

合理的GC方案

1)、Javascript引擎基础GC方案是(simple GC):mark and sweep(标记清除),即:

(1)遍历所有可访问的对象。
(2)回收已不可访问的对象。

2)、GC的缺陷

和其他语言一样,javascript的GC策略也无法避免一个问题:GC时,停止响应其他操作,这是为了安全考虑。而Javascript的GC在100ms甚至以上,对一般的应用还好,但对于JS游戏,动画对连贯性要求比较高的应用,就麻烦了。这就是新引擎需要优化的点:避免GC造成的长时间停止响应。
3)、GC优化策略
(1)分代回收(Generation GC)
这个和Java回收策略思想是一致的。目的是通过区分“临时”与“持久”对象;多回收“临时对象”区(young generation),少回收“持久对象”区(tenured generation),减少每次需遍历的对象,从而减少每次GC的耗时。
(2)增量GC
这个方案的思想很简单,就是“每次处理一点,下次再处理一点,如此类推”。
这种方案,虽然耗时短,但中断较多,带来了上下文切换频繁的问题。
因为每种方案都其适用场景和缺点,因此在实际应用中,会根据实际情况选择方案。
比如:低 (对象/s) 比率时,中断执行GC的频率,simple GC更低些;如果大量对象都是长期“存活”,则分代处理优势也不大。

九、Array

属性

length 不是只读

静态方法

Array.isArray()

实例方法

join()
push()和pop()
shift() 和 unshift()
sort()
reverse()
concat()
slice():不会影响原来数组
splice()
indexOf()和 lastIndexOf() )

迭代方法

forEach() :对数组中的每一项运行传入的函数。这个方法没有返回值, 本质上与使用 for 循环迭代数组一样。
map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
filter():对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。
every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true。
some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true。
reduce()和 reduceRight():归并方法=>这两个方法都会迭 代数组的所有项,然后构建一个终返回的值

十、Date

静态方法

Date.parse()
Date.UTC()
Date.now()

实例方法

getYear()
getFullYear()
getMonth()
getDate():返回日期月份中的天数(1到31)
getDay():返回日期中星期的星期几(其中0表示星期日,6表示星期六)
getTime():返回表示日期的毫秒数;与valueOf()方法返回的值相同
getHours()
getMinutes()
getSeconds()
getMilliseconds()
toLocaleDateString():以特定于地区的格式显示星期几、月、日和年;
toLocaleTimeString():以特定于实现的格式显示时、分、秒

十一、RegExp

var expression = / pattern / flags ;

flags

g:表示全局(global)模式
i:表示不区分大小写(case-insensitive)模式,
m:表示多行(multiline)模式

元字符

( [ { \ ^ $ | ) ? * + .]}

实例属性

 `global`:布尔值,表示是否设置了 g 标志
 ` ignoreCase`:布尔值,表示是否设置了 i 标志
 ` lastIndex`:整数,表示开始搜索下一个匹配项的字符位置,从 0算起
 ` multiline`:布尔值,表示是否设置了 m 标志
 `source`:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回

实例方法

exec()

十二、基本包装类型Boolean/Number/String

  • 是一个专门封装原始类型的值,并提供对原始类型的值执行操作的API对象

Boolean

Number

toFixed()

String

length
charAt():以单字符字符串的形式返回给定位置的那个字符
charCodeAt():字符编码
concat()
slice()
substr()
substring()
indexOf()
lastIndexOf()
trim()
toLowerCase()
toUpperCase()
match()
replace()
split()

十三、单体内置对象Global/Math

**URI编码方法 **

encodeURI():用于整个 URI,不会对本身属于 URI 的特殊字符进行编码,例如冒号、正斜杠、 问号和井字号
encodeURIComponent(): URI中的某一段,会对它发现的任何非标准字符进行编码。
decodeURI()
decodeURIComponent()

eval()

Math对象

Math.E 自然对数的底数,即常量e的值
Math.LN10 10的自然对数
Math.LN2 2的自然对数
Math.LOG2E 以2为底e的对数
Math.LOG10E 以10为底e的对数
Math.PI π的值
Math.SQRT1_2 1/2的平方根(即2的平方根的倒数)
Math.SQRT2 2的平方根
min() max()方法用于确定一组数值中的小值和大值。
Math.ceil()
Math.floor()
Math.round()
Math.random()方法返回大于等于 0小于 1的一个随机数
Math.abs(num) 返回num 的绝对值
Math.asin(x) 返回x 的反正弦值
Math.exp(num) 返回Math.E 的num 次幂
Math.atan(x) 返回x 的反正切值
Math.log(num) 返回num 的自然对数
Math.atan2(y,x) 返回y/x 的反正切值
Math.pow(num,power) 返回num 的power 次幂
Math.cos(x) 返回x 的余弦值
Math.sqrt(num) 返回num 的平方根
Math.sin(x) 返回x 的正弦值
Math.acos(x) 返回x 的反余弦值
Math.tan(x) 返回x 的正切值

相关文章

  • JavaScript高程读书笔记(3)

    八、垃圾回收 标记清除 当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,...

  • JavaScript高程读书笔记(目录)

    JavaScript高程读书笔记(1) 一、script标签 二、noscript标签 三、严格模式 四、数据类型...

  • JavaScript高程读书笔记(1)

    一、script标签 async属性(只是适用于外部脚本文件)立即下载脚本,但不妨碍页面其他操作 defer属性(...

  • JavaScript高程读书笔记(2)

    五、操作符 算数操作符、位操作符、关系操作符、 相等操作符 一元操作符++和--:注意a+++,- 位操作符按位非...

  • JS高程(一)

    复习 JavaScript 高程, 基本上 是 摘抄原文。 在 HTML 中 使用 JavaScript JS 包...

  • JavaScript高程读书笔记-面向对象设计

    一、理解对象 1、什么是对象面向对象(Object-Oriented,OO),ECMA中对象定义是:无序属性的集合...

  • JS面向对象精要(一)_原始类型和引用类型

    最近抽空拜读了下尼古拉斯的《javascript面向对象精要》,这本书算是高程3中的节选章节,不过作者换了一种思路...

  • 05 | 读JavaScript 高程

    这是第五章引用类型,这一章涉及引用类型的种类,各个类型身上的方法等相关内容。 主要知识点: 1.引用类型和类和对象...

  • 01 | 读 JavaScript 高程

    缘起 总感觉自己前端的知识体系不是很系统,打算读一下这本很多人推荐的书,从目录来看第三版有些东西在2020年可能已...

  • 02 | 读 JavaScript 高程

    今天来瞧一瞧第二章在 HTML中使用 JavaScript script 标签属性的变化 首先是 script 标...

网友评论

      本文标题:JavaScript高程读书笔记(3)

      本文链接:https://www.haomeiwen.com/subject/jkrdcftx.html