第 1 章 JavaScript 简介
1.2 JavaScript 实现
DOM 级别
DOM0, 实际不存在, 指的是 Internet explorer4.0 和 Netscape navigator4.0 最初支持的 Dhtml.
DOM1,DOM 核心和 DOM HTML.
DOM2, 扩充鼠标, 用户界面事件, 范围, 历遍, CSS 支持.
DOM3, 引入以统一方式加载和保存文档的方法, 新增验证文档方法 DOM 验证, DOM 核心扩展等.
第 2 章 在 HTML 中使用 JavaScript
2.1 <script> 元素
charset, 指定的代码字符集, 大多数浏览器会忽略它的值.
defer, 延迟到文档完全被解析和显示之后再执行. 但在现实中, 多个延迟脚本不一定会按照顺序执行, 建议只包含一个延迟脚本. HTML5 会忽略该属性.
async, 立即下载脚本. 目的是不让页面等待两个脚本下载和执行. 多个 async 脚本不一定按照他们的先后顺序执行, 确保 async 脚本之间互不依赖.
浏览器会按照 < script > 出现的先后顺序依次解析.
2.4 <noscript > 元素
<noscript > 用于在不支持 JavaScript 的浏览器中显示替代内容.
第 3 章 基本概念
3.4 数据类型
typeof 是一个操作符而不是函数, 因此 typeof()加圆括号不是必须的.
typeof null 返回 object, 因为 null 被认为是一个空的引用对象. null 值表示一个空对象指针.
typeof 正则表达式 返回 function 或 object.
函数是一种特殊的对象.
对于尚未初始化和没被声明的变量, typeof 都会返回 undefined.
只要保存对象的变量还没有真正保存对象时, 就应该明确让该变量保存 null 值.
null==undefined 返回 true, 因为 undefined 值是派生自 null 值的.
if(Boolean(message))与 if(message)等价, false,""(空字符串),0,NaN,bull,undefined 的布尔值都为 false.
八进制字面值第一位必须是 0, 然后是八进制数字序列 0-7, 如果字面值超出范围, 前导 0 将忽略, 后面数值被当做十进制数值解析. 如
- onum1=070;// 八进制 56
- onum2=079;// 十进制 79
- onum3=08;// 十进制 8
在进行算数计算时, 所有八进制和十六进制数值都将转换为十进制数值.
保存浮点数值需要的内存空间是保存整数值的 2 倍.
浮点数值最高精度是 17 位小数, 但在计算时不能测试特定的浮点数. 如 a+b==0.3 将得不到准确结果, 因为 0.1+0.2 结果是 0.30000000000000004. 这是 IEEE754 数值浮点计算的通病.
浏览器最小数值 Number.MIN_VALUE=5e-324, 最大数值 Number.MAX_VALUE=1.7976931348623157e+308.
超出范围的值将自动转换为 Infinity(无穷).Number.NEGATIVE_INFINITY=-Infinity,Number.POSITIVE_INFINITY=Infinity.
isFinite()函数判断数值是否是有穷的, 返回布尔值.
NaN, 非数值, number/0=NaN. 涉及 NaN 的操作都会返回 NaN, 且 NaN==NaN 返回 false.
isNaN()函数判断是否 "不是数值". 如 isNaN(NaN)返回 true,isNaN("blue")返回 true,isNaN(true)返回 false(可以被转为数值 1),isNaN(false)返回 false(可以被转为数值 0).
转型函数 Number()可用于任何数据类型, parseInt(),parseFloat()用于把字符串转换成数值.
Number("")返回 0,parseInt("")返回 NaN.
parseInt("070")在 ES3 中解析为 56(八进制),ES5 中 parseInt()已不具有解析八进制的能力, 因此为解析为 0. 可指定基数 parseInt("070",8)确保按八进制解析.
parseFloat()只能解析十进制, 从第一个字符解析到遇见第一个无效的浮点数字字符为止.
若字符串中包含双音节字符, length 属性可能不会精确的返回字符串中的字符数目.(why?)
toString()可以将数值, 布尔值, 对象和字符串值转换为字符串. 但是 null 和 undefined 没有这个方法. 如 toString(10)返回 "10"(字符串).
Srting()能够将任何类型转换为字符串. 如 Srting(null)返回 "null".
3.5 操作符
一元加和减操作符主要用于基本算数运算, 或者用于转换数据类型, 即将非数值转换为数值(包括 NaN).
&&(逻辑或)是短路操作符, 即如果第一个操作符求值结果为 true, 就不会对第二个操作数求值了, 可以利用这一行为避免为变量赋 null 或 undefined 值.
加法操作符, 如果有一个操作数是字符串时, 则将另一个操作数转换为字符串, 再拼接起来. 如
var message='blue'+3+5;// 结果是 blue35.
比较两个字符串时, 实际是比较两个字符串对应位置的每个字符的字符编码值, 因此'Blue'<apple 返回 true. 因为大写字母的字符编码全部小于小写字母.
任何操作数与 NaN 比较时结果都是 false.
==(相等)和!=(不相等), 先将对象转换成相似的类型, 再比较. NaN==NaN 返回 false,NaN!=NaN, 返回 true.null==undefined 返回 true.
===(全等)和!==(不全等), 仅比较不转换. NaN===NaN 返回 false.null==undefined 返回 false(因为不是同类型).
逗号操作符赋值时, 返回表达式最后一项. 如
var a=(1,2,3);//a 结果为 3
3.6 语句
不存在块级作用域, 因此在循环内部定义的变量也可以在外部环境访问到.
for-in 语句用来枚举对象的属性.
使用 label 标签的嵌套循环中有 continue, 会跳出内循环继续执行外循环中的语句. 如
- num=0;
- outermost:for(i=0;i<10;i++){
- for(j=0;j<10;j++){
- if(i==5&&j==5){
- continue outermost;
- }num++;
- }
- }
- //num 结果为 95
不使用 label 标签的嵌套循环中有 break, 会跳出内循环, 从头执行外循环. 如
- num=0;
- for(i=0;i<10;i++){
- for(j=0;j<10;j++){
- if(i==5&&j==5){
- break;
- }
- num++;
- }
- }
- //num 结果为 94.
switch 语句中可以使用任何类型, 比较值时使用的是全等操作符.
3.7 函数
定义两个同名函数, 位于后面的会覆盖前面的.
arguments 对象可以访问传入函数的参数. 如 arguments[0]的值是函数的第一个参数的值. arguments 与参数值是同步的, 但内存空间是独立的.
第 4 章 变量, 作用域和内存问题
4.1 基本类型和引用类型的值
操作对象时实际上是在操作对象的引用而不是实际的对象.
不能给基本类型的值添加属性.
从一个对象向另一个对象复制基本类型的值时, 会在变量对象上创建一个新值, 然后把该值复制到为新变量分配到位置上.
从一个变量向另一个变量复制引用类型的值时, 同样也会将存储在变量对象中的值复制一份放到为新变量准备的空间中. 但是这个值的副本实际上是个指针. 复制结束后两个变量实际上引用同一个对象.
参数只能按值传递.
instanceof(), 检测引用类型的值. 如果变量是给定引用类型(有 Object,Array,RegExp 等), 返回 true. 如 person instanceof Object 如果 person 是对象返回 true.
ESCA-262 规定任何在内部实现 [[Call]] 方法的对象都应该在应用 typeof 时返回 function. 因此 typeof 正则表达式 返回 function, 在 IE 和 Firefox 中, 返回 object.
4.2 执行环境及作用域
每个环节都可以向上搜索作用域链, 以查询变量和函数名; 但任何环境都不能通过向下搜索作用域链而进入另一个执行环境.
try-catch 语句的 catch 块和 with 语句可以延长作用域, 在作用域链的前端临时增加一个变量对象, 该对象会在代码执行后被移除.
p75 4.2.1 中 url 作用域被延长?(why?)
4.3 垃圾收集
解除引用, 一旦数据不再有用, 最好通过将其值设置为 null 来释放其引用.
来源: http://www.jianshu.com/p/cb9ccf3edb2c