再看《JavaScript高级程序设计》第1-4章
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再看《JavaScript高级程序设计》第1-4章相关的知识,希望对你有一定的参考价值。
第二章 在html中使用javascript
1、<script>元素的属性
1)async:可选,表示立即下载脚本,但可以同时进行页面的其他操作,async=”async”,只适用于外部文件,Firefox3.6、Safari5和Chrome有效
2)charset:可选,表示通过src属性指定的代码的字符集
3)defer:可选,表示脚本可以延迟到文档完全被解析和显示之后再执行,defer=”defer”,只适用于外部文件,IE4、Firefox3.5、Safari5和Chrome有效
4)language:已废弃
5)src:可选,表示包含要执行代码的外部文件
6)type(MIME类型):可选,表示编写代码使用脚本语言的内容类型,一般为type=text/javascript
2、<script>元素的使用:包含在<script>元素内部的JavaScript代码将被从上至下依次解释,在解释器对<script>元素内部的所有代码求值完毕以前,页面中的其余内容都不会被浏览器加载或显示。注意不要在非结束位置放置</script>,或者使用转义字符“\”。
1)直接在页面中嵌入JavaScript代码:<script type=”text/javascript”></script>
2)包含外部JavaScript文件:<script type=”text/javascript” src=”example.js”></script>,注意不要再包含嵌入代码。
第三章 基本概念
1、语法
1)区分大小写
2)标识符:第一个字符必须是一个字母,下划线和美元符号,其他字符可以是字母、下划线、美元符号或数字。ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写
3)注释:单行注释//,多行注释/**/
2、变量:定义变量都使用var操作符,用var操作符定义的变量将成为定义该变量的作用域中的局部变量;省略var操作符创建的变量是全局变量;可以使用一个语句定义多个变量,用逗号分隔
3、数据类型:基本数据类型:Undefined、Null、Boolean、Number和String;复杂数据类型:Object
1)typeof操作符:对一个值使用 typeof 操作符可能返回下列某个字符串:
"undefined" ——如果这个值未定义;
"boolean" ——如果这个值是布尔值;
"string" ——如果这个值是字符串;
"number" ——如果这个值是数值;
"object" ——如果这个值是对象或 null ;
"function" ——如果这个值是函数。
2)Undefined类型:undefined用于表示未经初始化的变量
3)Null类型:值为null用于表示空对象指针
4)Boolean类型:值为true或false;Boolean()函数:将一个值转换为其对应的 Boolean 值。
数据类型 |
转换为true的值 |
转换为false的值 |
Boolean |
true |
false |
String |
任何非空字符串 |
" "(空字符串) |
Number |
任何非零数字值(包括无穷大) |
0和NaN |
Object |
任何对象 |
null |
Undefined |
n/a(不适用) |
undefined |
5)Number类型:十进制、八进制(第一位必须是0,后面是0~7)、十六进制(第一位必须是0x,后面是0~F);在进行算术计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。
浮点数值:由于保存浮点数值需要的内存空间是保存整数值的两倍,因此 ECMAScript会不失时机地将浮点数值转换为整数值;
isFinite() 函数:用于确定一个数值是不是有穷的。
NaN:这个数值用于表示一个本来要返回数值的操作数未返回数值的情况;任何涉及 NaN 的操作都会返回 NaN; NaN 与任何值都不相等,包括 NaN 本身。isNaN()函数接收一个参数——任何类型,用于确定这个参数是否不是数值;isNaN() 在接收到一个值之后,会尝试将这个值转换为数值;任何不能被转换为数值的值都会导致这个函数返回 true 。
数值转换:
Number() 函数的转换规则如下:
如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。
如果是数字值,只是简单的传入和返回。
如果是 null 值,返回 0。
如果是 undefined ,返回 NaN 。
如果是字符串,遵循下列规则:
n 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值(注意:前导的零被忽略了);
n 如果字符串中包含有效的浮点格式,如 "1.1" ,则将其转换为对应的浮点数值(同样,也会忽略前导零);
n 如果字符串中包含有效的十六进制格式,例如 "0xf" ,则将其转换为相同大小的十进制整数值;
n 如果字符串是空的(不包含任何字符),则将其转换为 0;
n 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN 。
如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN ,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符串值。
parseInt() 函数的转换规则如下:接收两个参数——字符串和转换的基数;如果第一个字符不是数字字符或者负号, parseInt()就会返回 NaN ;如果第一个字符是数字字符, parseInt() 会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符;如果字符串以 "0x" 开头且后跟数字字符,就会将其当作一个十六进制整数;如果字符串以 "0" 开头且后跟数字字符,则会将其当作一个八进制数来解析。
parseFloat() 函数的转换规则如下:字符串中只有第一个小数点是有效的;解析过程中忽略前导的零;十六进制格式的字符串则始终会被转换成 0;如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零), parseFloat() 会返回整数。
6)String类型:ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
toString() 方法:数值、布尔值、对象和字符串值(没错,每个字符串也都有一个 toString() 方法,该方法返回字符串的一个副本)都有 toString() 方法。但 null 和 undefined 值没有这个方;在调用数值的 toString() 方法时,可以传递一个参数:输出数值的基数。
String()方法:如果值有 toString() 方法,则调用该方法(没有参数)并返回相应的结果;如果值是 null ,则返回 "null" ;如果值是 undefined ,则返回 "undefined" 。
7)Object类型:
constructor :保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是 Object() 。
hasOwnProperty(propertyName) :用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名( propertyName )必须以字符串形式指定。
isPrototypeOf(object) :用于检查传入的对象是否是传入对象的原型。
propertyIsEnumerable(propertyName) :用于检查给定的属性是否能够使用 for-in 语句来枚举。与 hasOwnProperty() 方法一样,作为参数的属性名必须以字符串形式指定。
toLocaleString() :返回对象的字符串表示,该字符串与执行环境的地区对应。
toString() :返回对象的字符串表示。
valueOf() :返回对象的字符串、数值或布尔值表示。通常与 toString() 方法的返回值相同。
5、操作符
1)一元操作符:
执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的;
执行后置递增和递减操作时,变量的值都是在语句被求值以后改变的;
在对非数值应用一元加操作符时,该操作符会像 Number() 转型函数一样对这个值执行转换。换句话说,布尔值 false 和 true 将被转换为 0 和 1,字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的 valueOf() 和(或) toString() 方法,再转换得到的值。
2)位操作符:
按位非(~)就是返回数值的反码;
按位与(&)只在两个数值的对应位都是 1 时才返回 1,任何一位是 0,结果都是 0;
按位或(|)在有一个位是 1的情况下就返回 1,而只有在两个位都是 0的情况下才返回 0;
按位异或(^)这个操作在两个数值对应位上只有一个 1 时才返回 1,如果对应的两位都是 1 或都是 0,则返回 0;
左移(<<)会将数值的所有位向左移动指定的位数,左移不会影响操作数的符号位;
有符号的右移(>>)会将数值向右移动,但保留符号位(即正负号标记),会以符号位的值来填充所有空位;
无符号的右移(>>>)以 0 来填充空位;对正数的无符号右移与有符号右移结果相同,无符号右移操作符会把负数的二进制码当成正数的二进制码。
3)布尔操作符:
逻辑非(!):如果操作数是一个对象,返回 false ;如果操作数是一个空字符串,返回 true ;如果操作数是一个非空字符串,返回 false ;如果操作数是数值 0,返回 true ;如果操作数是任意非 0 数值(包括 Infinity ),返回 false ;如果操作数是 null ,返回 true ;如果操作数是 NaN ,返回 true ;如果操作数是 undefined ,返回 true ;
逻辑与(&&):如果第一个操作数是对象,则返回第二个操作数;如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;如果两个操作数都是对象,则返回第二个操作数;如果有一个操作数是 null ,则返回 null ;如果有一个操作数是 NaN ,则返回 NaN ;如果有一个操作数是 undefined ,则返回 undefined ;
逻辑或(||):如果第一个操作数是对象,则返回第一个操作数;如果第一个操作数的求值结果为 false ,则返回第二个操作数;如果两个操作数都是对象,则返回第一个操作数;如果两个操作数都是 null ,则返回 null ;如果两个操作数都是 NaN ,则返回 NaN ;如果两个操作数都是 undefined ,则返回 undefined 。
4)乘性操作符:
乘法(*):如果是 Infinity 与 0 相乘,则结果是 NaN ;如果是 Infinity 与非 0 数值相乘,则结果是 Infinity 或 -Infinity ,取决于有符号操作数的符号;如果是 Infinity 与 Infinity 相乘,则结果是 Infinity ;如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则;
除法(/):如果是 Infinity 被 Infinity 除,则结果是 NaN ;如果是零被零除,则结果是 NaN ;如果是非零的有限数被零除,则结果是 Infinity 或 -Infinity ,取决于有符号操作数的符号;如果是 Infinity 被任何非零数值除,则结果是 Infinity 或 -Infinity ,取决于有符号操作数的符号;如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则;
求模(%):如果被除数是无穷大值而除数是有限大的数值,则结果是 NaN ;如果被除数是有限大的数值而除数是零,则结果是 NaN ;如果是 Infinity 被 Infinity 除,则结果是 NaN ;如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;如果被除数是零,则结果是零;如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。
5)加性操作符:
加法(+):如果有一个操作数是 NaN ,则结果是 NaN ;如果是 Infinity 加 Infinity ,则结果是 Infinity ;如果是 -Infinity 加 -Infinity ,则结果是 -Infinity ;如果是 Infinity 加 -Infinity ,则结果是 NaN ;如果是+0 加+0,则结果是+0;如果是-0 加-0,则结果是-0;如果是+0 加-0,则结果是+0;如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来;如果有一个操作数是对象、数值或布尔值,则调用它们的 toString() 方法取得相应的字符串值,然后再应用前面关于字符串的规则;对于 undefined 和 null ,则分别调用 String() 函数并取得字符串 "undefined" 和 "null" ;
减法(-):如果有一个操作数是 NaN ,则结果是 NaN ;如果是 Infinity 减 Infinity ,则结果是 NaN ;如果是 -Infinity 减 -Infinity ,则结果是 NaN ;如果是 Infinity 减 -Infinity ,则结果是 Infinity ;如果是 -Infinity 减 Infinity ,则结果是 -Infinity ;如果是+0 减+0,则结果是+0;如果是+0 减-0,则结果是-0;如果是-0 减-0,则结果是+0;如果有一个操作数是字符串、布尔值、 null 或 undefined ,则先在后台调用 Number() 函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是 NaN ,则减法的结果就是 NaN ;如果有一个操作数是对象,则调用对象的 valueOf() 方法以取得表示该对象的数值。如果得到的值是 NaN ,则减法的结果就是 NaN 。如果对象没有 valueOf() 方法,则调用其 toString()方法并将得到的字符串转换为数值。
6)关系操作符:小于(<)、大于(>)、小于等于(<=)、大于等于(>=), 如果两个操作数都是数值,则执行数值比较;如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;如果一个操作数是对象,则调用这个对象的 valueOf() 方法,用得到的结果按照前面的规则执行比较。如果对象没有 valueOf() 方法,则调用 toString() 方法,并用得到的结果根据前面的规则执行比较;如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
7)相等操作符:
相等和不相等(==、!=):先转换再比较;
全等和不全等(===、!==):仅比较而不转换
8)条件操作符:variable = boolean_expression ? true_value : false_value;
9)赋值操作符:乘赋值(*=)、除赋值(/=)、模赋值(%=)、加赋值(+=)、减赋值(-=)、左移赋值(<<=)、有符号右移赋值(>>=)、无符号右移赋值(>>>=)
10)逗号操作符
6、语句
1)if语句
2)do-while语句
3)while语句
4)for语句
5)for-in语句:用于枚举对象的属性,for (property in expression) statement
6)lable语句:在代码中添加标签
7)break和continue语句
8)with语句:将代码的作用域设置到一个特定的对象中
9)switch语句:
switch (expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
7、函数
1)参数:在函数体内可以通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数; arguments 对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。
2)没有重载:如果在 ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。
第四章 变量、作用域和内存问题
1、基本类型和引用类型的值
1)动态的属性
2)复制变量值:当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。复制操作结束后,两个变量实际上将引用同一个对象。
3)传递参数:参数只能按值传递;在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(命名参数);在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量。
4)检测类型:instanceof
2、执行环境及作用域
1)全局执行环境:在Web浏览器中,全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的
2)作用域链:内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。局部环境开始时会先在自己的变量对象中搜索变量和函数名,如果搜索不到则再搜索上一级作用域链。
3)延长作用域链:try-catch语句的catch块、witch语句
4)没有块级作用域
3、垃圾收集
1)标记清除:垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后它会去掉环境中的变量以及被环境中的变量引用的变量的标记,而在此之后再被加上标记的变量将被视为准备删除的变量原因是环境中的变量已经无法访问到这些变量了。
2)引用计数:当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数加1;如果同一个值又被赋给另一个变量,则该值的引用次数减1。
3)性能问题:如果垃圾收集例程回收的内存分配量低于15%,则变量、字面量和(或)数组元素的临界值加倍;如果例程回收了85%的内存分配量,则将各种临界值重置为默认值。
4)管理内存:解除引用
以上是关于再看《JavaScript高级程序设计》第1-4章的主要内容,如果未能解决你的问题,请参考以下文章
再看《JavaScript高级程序设计》第13141720-25章
JavaScript高级程序设计——第4章:变量作用域和内存问题
《JavaScript高级程序设计(第3版)》笔记-第1章-JavaScript 简介