第三章 基本概念
数据类型:
- 5种基本类型: Undefined,Null,Boolean,Number,String
- 1种复杂类型:Object
isNaN()
方法
数字类型转换
Number()
适用于任何数据类型的转换parseInt()
和parseFloat()
专门用于把字符串转换为数值
parseInt & parseFloat
parseInt(012, 10)
第二个参数表示转换的数字本身为十进制数parseFloat()
只能转换十进制数
++操作符
|
|
比较字符串
比较字符串大小时,比较的是字符编码值的大小
for的作用域
|
|
等价于
|
|
没有重载
可以通过检查传入函数的参数作出不同的反应,来模仿方法的重载
第四章 变量、作用域和内存问题
传递参数
访问变量有按值和按引用两种方式,而参数只能按值传递
|
|
证明参数为按值引用(可以理解为局部变量)
没有块级作用域
|
|
第五章 引用类型
常见引用类型
- Object
- Array
- Date
- RegExp
- Function
- 基本包装类型
- Boolen
- Number
- String
- 单体内置对象
- Global
- Math
检测数组
Array.isArray()
支持的浏览器:IE9+、Firefox 4+、Safari 5+、Opera 10.5+和Chrome
数组的迭代方法 ES5
- every
- filter
- forEach
- map
- some
以上方法均不改变原数组的值
数组的归并方法 ES5
- reduce
- reduceRight
函数声明与函数表达式
|
|
|
|
arguments.callee
|
|
第二种方式解除了函数与函数名的耦合
函数的属性
|
|
apply()
方法和 call()
方法
区别:
|
|
作用:扩充作用域
bind()
方法
|
|
toPrecision()
方法
|
|
charAt()
与 charCodeAt()
方法
|
|
slice()
、substr()
、substring()
方法
|
|
replace()
方法
第二个参数为字符串
|
|
第二个参数为函数时,传入函数的参数依次为:模式的匹配项,匹配项在字符串中的位置,原始字符串
split()
方法
分隔符可以是字符串,也可以是一个RegExp对象
第二个参数为返回数组的长度
单体内置对象
不需要显示地实例化内置对象,就可以直接使用其实例
Math
|
|
第六章 面向对象的程序设计
主要分为两部分,见如下两篇文章
《继承》
第七章 函数表达式
函数声明:
特征: 函数声明提升
函数表达式:
特征: 相当于赋值
闭包
概念:指有权访问另一个函数作用域中的变量的函数
|
|
在另一个函数(createComparisonFunction)内部定义的函数(匿名函数)会将外部函数的活动对象添加到它的作用域链中。
因此,内部匿名函数的作用域链中,会包含外部函数的活动对象
|
|
闭包与变量
闭包所保存的是整个变量对象,而不是某个特殊的变量
|
|
最后 result
中的每个值都是 10
可以通过创建另一个匿名函数强制让闭包的行为符合预期
|
|
this对象
匿名函数的执行环境具有全局性,因此其this通常指向window
|
|
通过把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了,如下:
内存泄漏
|
|
模仿块级作用域
|
|
多人协作时,可以通过创建私有作用域,来使用自己的变量,而不会扰乱全局作用域
私有变量
私有变量包括:
- 函数的参数
- 局部变量
- 在函数内部定义的其他函数
如:
在函数内部有三个私有变量: num1/num2/sum
在函数内部可以访问他们,但是在函数外部则不能访问他们
如果在这个函数内部创建一个闭包,则可以创建用于访问私有变量的公有方法(称为特权方法)
1.在构造函数中定义特权方法
2.使用静态私有变量来实现特权方法
模块模式
为单例创建私有变量和特权方法
|
|
增强的模块模式
适合单例必须是某种类型的实例,同时还必须添加某些属性和方法对其加以增强的情况
|
|
第八章 BOM
部分内容选自A tale of two viewports
Screen Size
screen.width
和screen.height
分别获得设备宽高(设备像素)
Window Size
window.innerWidth
和window.innerHeight
获得浏览器可视区域的css像素测量
但在Opera浏览器中window.innerWidth
和window.innerHeight
获得浏览器可视区域的设备像素测量
这意味着当我们放大或者缩小(用zomm的方式而不是拉伸)页面内容的时候
在其他浏览器中innerWidth
和innerHeight
是变化的,因为固定可视区域容纳的像素点变化了;
而在Opera浏览器中,由于上面两个属性代表设备的像素值,因此固定可视区域所容纳的设备像素点是不变的;
(两者都包含滚动条)
Scrolling offset
window.pageXOffset
和window.pageYOffset
包含了文档水平和垂直滚动的偏移量
(CSS像素)
Viewport
document.documentElement.clientWidth
和document.documentElement.clientHeight
表示视口宽高
(不包括滚动条)
element
document.documentElement.offsetWidth
和document.documentElement.offsetHeight
表示html元素尺寸
Event coordinates
间歇调用和超时调用
JavaScript是一个单线程序的解释器,因此一定时间内只能执行一段代码。为了控制要执行的代码,就有一个JavaScript任务队列。这些任务会按照将它们添加到队列的顺序执行。setTimeout()
的第二个参数告诉JavaScript再过多长时间把当前任务添加到队列中
如果队列是空的,那么添加的代码会立即执行;如果队列不是空的,那么它就要等前面的代码执行完了以后再执行
调用setTimeout()
后,该方法会返回一个数值ID,表示超时调用。这个超时调用ID是计划执行代码的唯一标识符,可以通过它来取消超时调用
一般认为,使用超时调用来模拟间歇调用是一种最佳模式
location对象
属性名 | 例子 |
---|---|
hash | “#contents” |
host | “www.wrox.com:80” |
hostname | “www.wrox.com” |
href | “http:/www.wrox.com” |
pathname | “/WileyCDA/“ |
port | “8080” |
protocol | “http:” |
search | “?q=javascript” |
decodeURIComponent()
用来解码URL中的query值
位置操作
可以通过 location.href = "http://www.baidu.com"
改变当前加载的页面
通过修改location
的其他属性也可以改变页面,并且会在历史记录中生成一条新记录
如果要避免生成记录,则可以用location.replace()
方法
location.reload()
// 重新加载(可能从缓存中加载)location.reload(true)
// 重新加载(从服务器重新加载)
history对象
|
|
第九章 客户端检测
- 能力检测
- 怪癖检测
- 用户代理检测
第十章 DOM
因为NodeList
是动态的,所以每一次操作都需要重新查询一遍,十分消耗性能,因此要尽量减少DOM操作
第十二章 DOM2 和 DOM3
元素大小
- 偏移量
- offsetHeight
- offsetWidth
- offsetTop
- offsetLeft
- offsetParent
- 客户区大小
- clientWidth
- clientHeight
- 滚动大小
- scrollHeight
- scrollWidth
- scrollLeft
- scrollTop
- 确定元素大小
- getBoundingClientRect()
第十三章 事件
事件流
从页面接收事件的顺序
- 事件冒泡*
- 事件捕获