此文是对js高级程序设计一书难点的总结,预计1-2周内可以完成,本有相当经典,希望能有所收获
1. Number类型关键点讲解
1.进制问题
1 | 1.八进制字面量在严格模式下无效,会导致支持该模式的js引擎抛出异常 |
2.浮点数注意点
1 | 1.浮点数值的最高精度是17位小数,但在进行算术计算时精度远远不如整数。例如 |
3.数值
1 | 1.使用isFinite(num)来确定一个数字是否有穷 |
4.数值转换
1 | parseFloat主要用于解析有效的浮点数字,始终会忽略前导的零,可识别所有的浮点数格式,但是十六进制格式的字符串始终会被转换成零。 |
2. 字符串
- toString() 转换为字符串
1 | let num = 10; |
3.循环
- break和continue
1 | break语句会立即退出循环,强制执行循环后面的语句 |
- switch语句在比较值时使用的是全等操作符,所以不会发生类型转换
- 函数参数arguments和命名参数
1 | // 此时读取n2和arguments[1]并不会访问相同的内存空间,他们的内存空间是独立的,但他们的值保持同步 |
4.变量,作用域和内存问题
1.传递参数
1 | 1.所有的参数都是按值传递的。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反应在函数外部 |
2.垃圾收集
1 | 1.js最常用的垃圾收集机制为“标记清除”,另一种不常用的是“引用计数”。 |
3.管理内存
1 | 1.解除引用:数据不再有用,将其值设置为null |
5.引用类型
1.数组
1 | // 检测数值ES5方法 |
2.Date对象
1 | 1. new Date(str | year,month,day,...) // 可以接收日期格式的字符串,也可以是year, month, day参数的数字 |
3.RegExp对象
1 | 1.由于RegExp构造函数的模式参数是字符串,所以在某些情况下要进行双重转义,对于\n双重转义为\\\\n |
4.函数
1 | // 函数内部属性 |
5.基本包装类型
1 | 1.Number |
6.面向对象的程序设计
1.属性类型
1 | // 1.数据属性 |
2.创建对象
1 | 1.工厂模式---返回新对象的方式 |
3.继承(原型链是实现继承的主要方式)
1 | 1.原型链的问题 |
7.函数表达式
闭包与变量
1 | 1.闭包只能取得包含函数中任何变量的最后一个值 |
this对象
1 | 1.在全局函数中,this等于window,而当函数被当作某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window |
内存泄漏
1 | **1.如果闭包的作用域链中保存着一个html元素,那就意味着该元素永远无法销毁。 |
8.BOM对象
1.window
1 | 1.BOM的核心对象是window,他表示浏览器的一个实例。 |
2.窗口位相关属性
1 | // 窗口位置(不同浏览器实现不一样,所以位置获取的不精确和统一) |
3.系统对话框
1 | // 显示打印对话框 |
4.location对象
1 | // location即是window对象的属性也是document对象的属性 |
5.navigator对象
1 | navigator.language // "zh-CN" 浏览器的主语言 |
6.history对象
1 | 1. history.go(0 | [123] | -1 | str) // 如果是Str,则会跳转到历史记录中包含该字符串的第一个位置 |
9.客户端检查
1.检查用户代理
1 | let client = function() { |
10. DOM
1.将NodeList对象转换为数组
1 | let arrayNodes = Array.prototype.slice.call(someNode.childNodes, 0); |
2.hasChildNodes() —在节点包含一或多个子节点的情况下返回true
3.操作节点
1 | 1.appendChild() //用于向childNodes末尾添加一个节点,返回新增的节点,如果节点已存在,那么就是从原来的位置移动到新位置 |
4.访问节点
1 | Node.firstChild[lastChild | parentChild | nextSibling | previousSibling] |
5.Document类型
1 | 1. document的节点类型nodeType的值为9; |
6.Element类型
1 | 1.nodeType值为:1 |
7.DocumentFragment类型
1 | 1.nodeType值为:11 |
11.DOM扩展
1.选择符
1 | 1.querySelector() // 参数为css选择符,返回与该模式匹配的第一个元素,没有找到返回null |
2.元素遍历(不包含文本节点和注释)
1 | // ie9+支持 |
3.与类相关的扩充
1 | classList |
4.焦点管理
1 | // 元素获得焦点的方式有: 页面加载,用户输入,在代码中调用focus |
5.HTMLDocument的变化
1 | readyState属性 |
6.插入标记
1 | insertAdjacentHTML() |
7.children
1 | // 获取元素集合,只包含元素节点 |
8.contains() 判断某个节点是否是另一个节点的后代
1 | // 例子 |
11.DOM2和DOM3
1.框架的变化
1 | // 访问内联框架的文档对象,如果内联框架来自不同域或者不同协议,访问该文档时会报错 |
2.元素大小
1 | 1.偏移量 |
12.事件
1.事件对象(event)
1 | 1. 属性或方法 |
2.事件类型
1 | 1.鼠标和滚轮事件 |
3.性能与内存
1 | 如果在页面写在之前没有清理干净事件处理程序,那他们就会滞留在内存中,每次加载完页面再卸载时,内存中滞留的对象就会增加,因为事件处理程序占用的内存并没有被释放。 |
13.表单脚本
1.选择文本inputEl.select() [用于选择文本框中的所有文本,不接受参数,可以在任何时候调用]
2.选择事件(select) //ie9+ 用户选择了文本并释放鼠标时触发
3.取得选择的文本
1 | // ie9+ 为被选择的元素添加了两个属性,selectionStart和selectionEnd,保存的是基于零的数值,表示所选的文本范围 |
4.选择部分文本
1 | // 所有文本框都有一个setSelectionRange(startIndex, endIndex) |
5.过滤输入
1 | 1.屏蔽字符 |
6.富文本编辑
1 | 1.使用contenteditable属性 |
14.HTML5脚本编程
1.跨文档消息传递
主要指来源于不同域的页面间的消息传递,主要利用iframe
1 | // 源页面 |
2.原生拖放
3.自定义媒体播放
1 | // 使用video,audio元素的play()和pause()方法,可以手工控制媒体的播放 |
15.ajax和comet
1 | // ajax |
16.高级技巧
1.高级函数
1 | //安全类型检测 |
2.防篡改对象
1 | // 不可扩展对象,使用该方法可以让传入的对象禁止添加属性和方法 |
3.高级定时器
1 | // 函数节流 |
4.自定义事件
1 | function EventTarget(){ |
17.离线应用与客户端存储
1.离线检测
1 | // 离线检测属性 |
2.应用缓存
1 | // 描述文件: offline.manifest,列出要下载和缓存的资源 |
3.web存储机制(cookie,localStorage,sessionStorage,indexedDB)
18.新兴API
1.requestAnimationFrame()
1 | (function(){ |
2.File API
1 | //通过监听change事件并读取files集合,就可以知道每个文件信息 |
3.web workers– 主要针对复杂的计算,不会影响用户体验
1 | // 页面worker |