第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来释放其引用。
网友评论