说明
参考资料:《JavaScript高级程序设计(第3版)》
笔记主要为《JavaScript高级程序设计(第3版)》读书记录,按照此书的章节学习记录。方便以后查询复习(PS:正版书99大洋,没舍得买。在淘宝46买了一本盗版的并带一本 《JavaScript DOM编程艺术(第2版)》)。两本书同时阅读,但以《JavaScript高级程序设计(第3版)》为主要学习路线。重要说明性内容将以近似书中原文摘出(以免出现个人解释歧义),外加自己遇到特殊情况说明(不一定完全正确)
第一章:JavaScript简介
JavaScript诞生于1995年。原名为LiveScript,为了追赶Java语言的热潮改名为JavaScript,实际上两者本无半毛钱的关系。
虽然JavaScript和ECMAScript通常都被人们用来表达相同的含义,但JavaScript的含义却比ECMA-262中规定的要多的多。一个完整的JavaScript实现应该由下列三个不同的部分组成。
核心(ECMAScript)
文档对象模型(DOM)
浏览器对象模型(BOM)
第二章:在HTML中使用JavaScript
向HTML页面中插入JavaScript的主要方法,就是使用<script>元素。
建议使用外部文件引入JavaScript,并建议内部的JavaScript写在HTML的底部
当浏览器不支持JavaScript或者脚本被禁用的时候可以使用<noscript>标签,仅当上述两者其一存在的时候显示标签中的内容。其他情况不会显示此标签。例如:
<noscript>
<p>您当前浏览器不支持JavaScript或脚本被禁用!</p>
</noscript>
第三章:基本概念
注:JavaScript区分大小写
语法:JavaScript的语法大量借鉴了C及其他类C语言(如Java和Perl)的语法。
标识符:是指变量、函数属性的名称,或者函数的参数。标识符可以是按照下列规则组合起来的一或多个字符:
1、 第一个字符必须是一个字母、下划线(_)或一个美元符号($);
2、 其他字符可以是字母、下划线或美元符号或数字。
注释:单行注释(// 注释内容)
块注释(/*
* 多行注释
*/)
语句:以一个分号(;)结尾,如果省略分号,则由解释器确定语句的结尾(PS:尽量不要这么些)
关键字和保留字(带*号上标的是第5版新增的关键字):
关键字:
break do instanceof typeof
case else new var
catch finally return void
continue for switch while
debugger* function this with
default if throw
delete in try
保留字
abstract enum int short
boolean export interface static
byte extends long super
char final native synchronized
class float package throws
const goto private transient
debugger implements protected transient
double import public
变量:JavaScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。定义变量时要使用var 操作符,后跟变量名。例如:
var msg = “Hello World”;
全局变量与局部变量:用var 操作符定义的变量将成为定义该变量的作用于中的局部变量。也就是说,如果在函数中使用var 定义一个变量,那么这个变量在函数退出后就会被销毁,例如:
function test(){
var msg = “hi”; // 局部变量
}
test();
alert(msg); // 错误!
但是在test函数中不用var 声明msg变量,此时msg就变成了全局变量(msg = “hi”; // 全局变量)。
注:for循环中声明的变量特殊。例如:
for(var i=0;i<10;i++){
// do someing
}
alert(“i=”+i); // 此时会输出”i=10”
数据类型:5中简单数据类型(基本数据类型):Undefined、Null、Boolean、Number和String。还有一种复杂的数据类型——Object。Object本质是由一组无序的名值对组成的。
typeof操作符:使用它可能返回下列某个字符串:
“undefined”——如果这个值未定义
“boolean”——如果这个值是布尔值
“string”——如果这个值是字符串
“number”——如果这个值是数值
“object”——如果这个值是对象或null
“function”——如果这个值是函数
Undefined和Null类型:
var message;
alert(message); // 输出undefined
比较Undefined与Null类型
alert(undefined == null); // 则会输出true
alert(undefined === null); // 则会输出false
Boolean类型:只有true与false两个值(且只有全小写为Boolean)
用Boolean强制转换(Boolean(your type)):
数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 空字符串(””)
Number 任何非零数字值(包括无穷大) 0和NaN
Object 任何对象 null
Undefined n/a undefined
(PS:n/a(或N/A),是not applicable的缩写,意思为“不适用”。)
Number类型:可以声明为八进制(以8为基数)或十六进制(以16为基数)和十进制。八进制必须以0开头且数字序列为0-7。十六进制以0x开头且数字序列为0-9或A-F
浮点数:计算精度可以精确到小数点后17位,但是进行算数计算时其精确度远远不如整数。例如:
0.1+0.2不等于0.3。而是等于0.30000000000000004。
负无穷:5e-324(Number.MIN_VALUE)
正无穷:1.7976931348623157e+308(Number.MAX_VALUE)
判断是否为无穷数:isFinite()
NaN:非数值
任何设计NaN操作都会返回NaN(例如:NaN/10返回NaN)
NaN不等于任何数值,包括本身
判断是否为数值:isNaN()
正数/0返回Infinty(正无穷)
负数/0返回-Infinty(负无穷)
0/0返回NaN
转换为数值类型:Number()、parseInt()、parseFloat()
Number()可以用来任何数据类型,而后两者主要用于字符串
Number()转换规则:
如果是Boolean值,true和false将分别转换为1和0
如果是数字值,只是简单的传入和返回
如果是null值,返回0
如果是undefined,返回NaN
如果是””返回0,其他字符串遵循强类型语言规则(略)
parseInt()转换:
如果是””返回NaN
如果是”123abc123”返回123(PS:字符串以次解析,直到完成,非数值会被忽略)
如果是”12.3”返回12
如果是转换8进制,需要提供第二个参数,例如:parseInt(“070”,8);返回56
parseFloat与上类似
String类型:
单引号或双引号包裹。
转义字符:
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\\ 斜杠
\’ 单引号
\” 双引号
数学函数:
Math.ceil(number):把浮点数number向”大于”方向舍入为与之最接近的整数
Math.floor(number):把浮点数number向”小于”方向舍入为与之最接近的整数
Math.round(number):把浮点数number四舍五入为最近接的整数
时间戳(2015-06-08 21:41)
PS:从上个时间戳至此阅了一遍《JavaScript DOM编程艺术(第二版)》感觉写的比较水、而且内容异常的少。看来本人喜欢买厚的书还是有一定“科(gou)学(pi)”依据的。
循环语句:
1、 do-while语句:是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。(至少执行以次循环体语句)
do{ statement }while(expression); |
2、 while语句:属于前测试循环语句。
var i = 0; while(i < 10){ i++; } |
3、 for语句:是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代码的能力。
for(var i = 0; i < 10 ; i++){ alert(i); } |
注:无限循环
for(;;){ // 无限循环 doSomething(); } |
4、 for-in语句:是一种精准的迭代语句,可以用来枚举对象的属性。
for(var propName in window){ document.write(propName); } |
注:当迭代的对象的变量值为null或者undefined时,for-in语句会抛出错误。可以通过try-catch(e)捕获
break和continue语句:
break:立即跳出循环体,退出循环。
continue:立即退出本次循环并进入下一次循环。
with语句:
作用是将代码的作用域设置到一个特定的对象中。
例:
var qs = location.search.substring(1); var hostname = location.hostname; var url = location.href; |
with缩减后:
with(location){ var qs = search.substring(1); var hostname = hostname; var url = href; } |
注:大量使用with会导致性能下降
switch语句:
switch(expression){ case value : statement break; case value : statement break; default: statement } |
注:等同于多个if-else
函数:
声明:
function functionName(arg0,arg1,…,argN){ statements } |
理解参数:
ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用的这个函数时也未必一定要传递两个参数。之所以这样子,是因为ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的永远都是这个数组,而不关心数组中包含哪些参数。实际上在函数体内可以通过arguments对象来访问这个数组,从而获取传递给函数的每一个参数。arguments对象只是与数据类似(它并不是Array的实例),因为可以使用方括号语法访问它的每一个元素(即第一个元素是arguments[0])