JavaScript高级程序设计 - 阅读笔记
【本博客为原创:http://www.cnblogs.com/HeavenBin/】
前言:
大致花费了一个星期的时间把这本书认真看了半本,下面是我做的阅读笔记,希望能够让看这本书的人有个大致的参考。目前可能写得较乱不够全面,后续我会整理添加。(2017-7-17)
第一章 JavaScript简介
第二章 HTML中使用JavaScript
第三章 基本概念
3.1.语法
区分大小写
标识符(建议用驼峰大小写myCar)
注释// /**/
严格模式(use strict)
语句 建议var diff-a-b;要用分号,以及 if( test ) { alert(test); }一句话也要用{}
3.2 关键字和保留字
3.3 变量
未初始化undefined var message = “hi”; message = 100; 类型随便换
Function test(){ Var a = “hi”; 局部 b = “hi”; 全局 }
Test(); alert(a); 错误 alert(b); hi
3.4 数据类型
typeof
Undefined (定义但未被赋值)
Null(空对象指针)
Boolean(布尔值 true false 流程控制语句会自动执行相应boolean转换)
Number
(八进制 0 十进制 十六进制 0x 浮点数值 数值范围 NaN 数值转换Number parseInt )
String(字符串,单双引号没区别,转义序列,字符串特点,toString String)
Object(对象 所有对象的基础 var o = new Object();)
函数在ES中是对象,不是一种数据类型。
3.5操作符
一元操作符 ++ -- 、+ -(可用于转换数据类型)
位操作符 按位非~num1 按位与& 按位或| 按位异或^ 左移<< 右移>> 无符号右移>>
布尔操作符 ! && || 乘性操作符 * / % 加性操作符 + - 关系操作符 < > <= >=
相等操作符 == != === !== 条件操作符 ?:
赋值操作符 = *= /= %= += -= <<= >>= >>>=
逗号操作符
3.6 语句
3.7 函数
arguments 没有重载
第四章 变量、作用域和内存问题
4.1 基本类型和引用类型的值
动态的属性 (引用类型能动态地添加属性)
复制变量值 (基本类型是不同的空间,引用类型是引用相同的空间)
传递参数 (一样)
检测类型 (typeof instanceof)
4.2执行环境及作用域
作用域链 延长作用域链(try-catch with) 没有块级作用域(if for 声明变量 查询标识符)
4.3垃圾收集
策略(标记清除 引用计数) 性能问题 管理内存
第五章 引用类型
5.1 Object类型
Var person = {};(适合给函数传入大量参数) var parson = new Object();
Person[“name”](使用变量来代表属性时用) person.name(推荐)
5.2 Array类型
Var colors = new Array(); var colors = Array(); var colors =[*****];
Colors[*] = *****; colors.length
检测数组: instanceof Array.isArray()
转换方法: toString() valueOf() toLocaleString() join()
栈方法: push() pop()
队列方法: shift() unshift()
重排序方法: reverse() sort(可加入比较函数这个参数)
操作方法:concat()原没变 添加 slice()原没变 截取段 splice()原变了 可删可添
位置方法: indexOf() lastIndexOf() 返回项的位置
迭代方法:every() filter() forEach() map() some() 对每个项都进行处理,但原数组不会变
并归方法:reduce()顺序 reduceRight()反序 对两项一直遍历到最后
5.3 Date类型
New Date() 里面parse(“May 25,2004”) UTC(2005,0) Date.now()
继承的方法:toLocaleString() toString() valueOf()
日期格式化方法:toDateString() toTimeString() toLocaleDateString() toLocaleTimeString() toUTCString()
日期/时间组件方法:太多具体看书
5.4RegExp类型
字面量 var pattern1 = / [bc]at / i;
构造函数 var pattern2 = new RegExp(“ [bc]at ”, ” i ”);
RegExp实例属性 global ignoreCase lastIndex multiline source 没什么卵用
RegExp实例方法:exec() 捕获组(捕获多组匹配项) text() 一次看是否匹配
RegExp构造函数属性:有点多,用来看最近一次匹配的相关信息
模式的局限性:缺少某些语言(Perl)所支持的高级正则表达式特性,但是绝大多数情况够用
5.5 Function类型 函数是对象(也是Function的实例),函数名是指针。
function sum(num1,num2) { }
Var sum = function(num1,num2){ };
没有重载:函数是对象,函数名是指针。
函数声明与函数表达式:function ******* 函数声明提升 var sum = ******* 不会提升
函数内部属性:arguments对象(属性callee指向函数) this对象(指向函数执行的环境对象) 属性caller (指向调用当前函数的函数,如果是全局作用域的函数则值为null)
函数属性和方法:
属性(length声明参数个数 prototype继承)
非继承方法: call() apply() bind()
a.apply( b, c); a.call( b, d );
在环境对象b里运行函数a ,顺便给a传入参数c( argument或者 数组) / d( 每项写 出来 )
Var a = b.bind(c);
a 是在c环境对象里运行的函数
5.6基本包装类型:
Boolean类型:var booleanObject = new Boolean(true); 建议永远不要使用Boolean对象。
Number类型:var numberObject = new Number(10); toFixed() toExponential() toPrecision()
也建议不要直接实例化Number类型。
String 类型:var stringObject = new String(“hello world”); length属性
1.字符方法:charAt()或者string[] 返回对应字符 charCodeAt() 返回对应字符编码
2.字符串操作方法:
concat() 或者 +操作符 和数组的concat()看起来一样
Slice() substring() substr() 截取字符串,三个很灵活
3.字符串位置方法:indexOf() lastIndexOf()
4.trim()方法 删除前置及后缀的所有空格 trimLeft() trimRight()
5.字符串大小写转换方法
toLowerCase() toUpperCase() 经典方法
toLocaleLowerCase() toLocaleUpperCase() 特定地区 这种更加稳妥
6.字符串的模式匹配方法
match() 和RegExp的exec()本质一样 返回匹配到字符串的数组
search() 返回第一个匹配项的索引 否则返回-1
replase() 匹配且替换字符串
split() 匹配分隔符生成数组
7.localeCompare() 比较两个字符串
8.fromCharCode() 静态方法 将多个字符编码变成字符串
9.HTML方法 比如big() <big>string</big>
5.7 单体内置对象
1.Global对象
URL编码方法:
encodeURI() 整个 encodeURIComponent() 某一段 编码
decodeURI() 整个 decodeURIComponent() 某一段 解码
eval()方法 非常强大 也非常危险 ECMAScript解析器
Global对象的属性 undefined、Array.........都是属性
Web浏览器是将全局对象作为window对象的一部分加以实现的
2.Math对象
Math对象的属性 一些特殊值比如π
min() max() 方法
舍入方法:小数值变整数
Math.ceil(25) 进一 Math.floor(25) 退一 Math.round(25) 四舍五入
random()方法 [0,1) 之间的随机数
其它方法 太多看书
第六章 面向对象的程序设计
6.1理解对象
6.1.1属性类型:
数据属性:4个特性
访问器属性:不包含数据值 4个特性 通过Object.defineProperty()定义
6.1.2定义多个属性: Object.defineProperties() 可以是数据属性,也可以是访问器属性。
6.1.3读取属性的特性:Object.getOwnPropertyDescriptor()
6.2创建对象
6.2.1工厂模式(看书)
6.2.2构造函数模式(看书 new constructor )
6.2.3原型模式:
1.理解原型对象
2.原型与in操作符( in for-in )
3.更简单的原型语法( 对象字面量来访问对象 )
4.原型的动态性( 原型可以换成另外一个对象,但对已经创建的实例无效了 )
5.原生对象的原型( 就是用原型模式,可以定义新方法在里面,但是不推荐)
6.原型对象的问题:没有属于实例自己的属性
6.2.4组合使用构造函数模式和原型模式
最常见的模式,实例有自己的属性和方法,也有共享的。
6.2.5动态原型模式
在上面的模式再加一个判断语句,来动态在原型中加入方法。
6.2.6寄生构造函数模式
和工厂模式的区别就一个new,还有它有多个return。返回的对象和构造函数没有关系,导致不能用instanceof操作符来确定对象的类型。不太建议使用。
6.2.7稳妥构造函数模式
跟寄生构造函数模式有相似处,但不用this和new。instanceof也检测不出
6.3继承
6.3.1原型链 原型搜索机制
1.别忘了默认的原型:所有函数的默认原型都是Object的实例。
2.确定原型和实例的关系:instanceof isPrototypeOf()
3.谨慎地定义方法:必须在实例替换原型之后才能定义新的方法。
4.原型链的问题:
在原型外的属性也给继承了
在创造子类型的实例时,不能向超类型的构造函数中传递参数。
很少单独使用。
6.3.2借用构造函数 利用call或apply 来继承和传递参数 但是只能使用构造函数模式。
也很少单独使用。
6.3.3组合继承
原型链实现 原型属性和方法的继承
借用构造函数实现 对实例属性的继承
最常用的继承方式
6.3.4原型式继承(看书)
没有用到构造函数 保持类型可以用用,但是会跟原型模式一样共享引用类型的属性。
6.3.5寄生式继承(看书)
不考虑构造函数 可以用用 但是不能做到函数复用
6.3.6寄生组合式继承(看书)
组合继承有问题:调用了两次超类型的构造函数,导致实例和原型中重复了属性。
寄生组合式继承解决了这个问题,成为了最理想的继承范式。
第七章 函数表达式
定义函数方式:
函数声明( 函数声明提升 有name)
函数表达式( name为空 匿名函数/命名 一般函数表达式都是匿名函数 )
7.1递归
严格模式不能用 arguments.callee 可以用命名函数表达式。
7.2闭包:有权访问另一个函数作用域中的变量的函数
自我总结:闭包是函数,一般用匿名函数
1.闭包可以访问返回外部函数中的变量。
2.另一个函数的活动对象会被保存,直到闭包的作用域链被销毁。
7.2.1闭包和变量
副作用:闭包的作用域链上保存的是整个变量对象,所以返回的变量是保存的最后一个值。
比如在for循环中,则会出现不如意的情况。
7.2.2关于this对象
闭包中的this对象,闭包可能在某些特殊情况被放到全局对象上,从而this变却不自知。
7.2.3内存泄漏
使用闭包,确保正常回收内存
7.3模仿块级作用域
用匿名自执行函数来模仿。
自我总结作用:
1.内部执行完就会摧毁。
2.匿名自执行函数可以减少污染全局方法和属性。
闭包就有一个内存的问题,用这个结合很舒适。
7.4私有变量
对象上的都是公有的 函数里面的都是私有的
通过闭包来创建函数的公有方法(特权方法) ---------用来获取私有变量
在构造函数中创建 -------- 构造函数this 浪费内存
例子:this.****** = function(){ **** };
但是每个实例化都会重新构建一组方法,浪费。
7.4.1静态私有变量 ---------原型 每个实例没有自己的私有属性
静态就用 私有作用域 通过闭包在全局的构造函数的原型里面来创建特权方法。
增进了代码的重用性,但是每个实例没有自己的私有变量。(因为这个叫静态私有变量)
使用实例变量,还是静态私有变量,看具体需求。
7.4.2模块模式 ---------return返回对象字面量 一个实例对象
为单例创建私有变量和特权方法(单例:只有一个实例的对象)
在匿名函数内部定义私有变量和方法,然后将一个对象字面量作为函数的返回值。
7.4.3增强的模块模式
必须是某种类型的实例,同时还必须添加某些属性或方法。
未完待续.....
如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力
JavaScript高级程序设计 - 阅读笔记的更多相关文章
- javascript高级程序设计阅读笔记(一)
javascript高级程序设计阅读笔记(一) 工作之余开发些web应用作为兴趣,在交互方面需要掌握javascript和css.HTML5等技术,因此读书笔记是必要的. javascript简介 J ...
- JavaScript高级程序设计—阅读笔记(第一部分)
第一章 JavaScript简介1.JavaScript组成(核心(ECMAScript),文档对象模型(DOM),浏览器对象模型(BOM))2.文档对象模型(DOM),提供访问和操作网页内容的方法和 ...
- 【javascript学习——《javascript高级程序设计》笔记】DOM操作
DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次节点树,允许开发人员添加.移除和修改. 1.节点层次 <html> <head& ...
- 《JavaScript高级程序设计》笔记——第一章到第三章
2019年,新年伊始,我打算好好重读一下<JavaScript高级程序设计>这本前端必备经典书.每天半小时. 以下内容摘自<JavaScript高级程序设计> 2019-2-1 ...
- JavaScript高级程序设计---学习笔记(一)
今天,2017.3.17开始利用课余时间仔细学习<JavaScript高级程序设计>,将需要掌握的知识点记录下来,争取把书里的所有代码敲一遍并掌握. 1.标识符命名最好是第一个字母小写,剩 ...
- 《javascript高级程序设计》笔记三
第三章 基本概念 任何语言的核心必然会描述这门语言最基本的工作原理.这部分内容对我们来说,读起来很乏味,甚至会产生困意,但这部分内容却是重要的!我有幸拜读<JavaScript高级程序设计> ...
- javascript高级程序设计学习笔记
javascript高级程序设计,当枕头书已经好久了~zz 现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...
- 《JavaScript高级程序设计》笔记整理
欢迎各位指导与讨论 : ) -------------------------待续------------------------------- 本文为笔者在学习时整理的笔记,如有错漏,恳请各位指出, ...
- JavaScript高级程序设计-读书笔记(7)
第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...
随机推荐
- redis内存消耗详解
Redis所有的数据都存在内存中,相对于廉价的硬盘,内存资源还是比较昂贵的,因此如何高效利用redis内存变得非常重要. 内存消耗分析 管理内存的原理和方法 内存优化技巧 一.内存消耗 理解redis ...
- java使用Junit工具进行单元测试
目录 1.类的定义: 2.Junit工具的使用: 3.对该类进行单元测试并查看结果: 4.记录各个阶段的时间 5.将过程记录在个人博客上(github地址) 1.类的定义:类是同一事物的总称,类是封装 ...
- 优雅的封装ajax,含跨域
之前写过一篇 先定一个小目标,自己封装个ajax,是基于原生js的,也就是jquery中ajax的简化版本实现的思路.众所周知,jquery的ajax是项目中最常用的请求后台的方式,也算是封装的很完美 ...
- Java探秘之基本数据类型和包装类(int,Integer)(一)
最近闲来无聊打算做一个博客网,没事记记笔记什么,可是网站不好做,需要点时间,就先写写笔记来练练手. 可是要写什么呢,太难的好像我也写不出来,万一写错了误导别人就不好了. 哈哈,不多说,直奔主题,要是写 ...
- Django学习(四)---Admin配置
1)Admin: admin是django自带的功能强大的自动化数据管理界面 被授权的用户可以直接在Admin中管理数据库(增.删.改.查) Django提供了许多针对Admin的定制功能 2)配置A ...
- java用户界面——加载图片 jpg GIF
java用户界面--加载图片 jpg GIF 代码如下: package day08; import java.awt.GridLayout; import javax.swing.Icon;impo ...
- Openfire3.9.1+jdk1.7导入到eclipse中
Openfire3.9.1+jdk1.7导入到eclipse中 写这篇文章,也是记录一下自己几晚上的辛苦,因为作为新手在网上看了很多的资料,但是按照他们的我总是出不来,跟他们描述的不一致,可能是环境问 ...
- monkeyscript - 定制化monkey流程
作为移动端测试必须掌握的初级Android稳定性工具:monkey,提到它时,脑海里一般涌现出两句话: 1.我会用,很简单 就是一行命令,一回车就开始跑起来了 2.使用问题多,不好用 太随机,很多操作 ...
- (转)Linux下增加交换分区的大小
场景:最近在Linux环境安装ELK相关软件时候发现机器特别的卡,所以就查看了Linux机器的内存使用情况,发现是内存和交换分区空间太小了. 对于虚拟机中的内存问题,可以直接通过更改虚拟机的硬件进行解 ...
- zookeeper单机模式安装
zookeeper单机模式安装 更多文章:http://blogxinxiucan.sh1.newtouch.com/2017/07/26/zookeeper单机模式安装/ 下载zookeeper u ...