第一章
- java script是一种专门为网页交互而设计的脚本语言
- ECMAScript 提供核心语言功能
- 文档对象模型DOM 提供访问和操作网页内容的方法和接口
- 浏览器对象模型,提供与浏览器交互的方法和接口
第二章
2.1 <script>
向HTML页面插入JavaScript的主要方法就是是用<script>元素
- async
- charset
- defer
- language
- src
- type : 表示编写代码使用的脚本语言的内容类型(也称为MIME类型)
- 直接在页面中嵌入JavaScript
- 包含外部JavaScript
在解释器对<script>元素内部的所有代码求值完毕以前,页面中的其余内容都不会被浏览器加载或显示
带有 src 属性的<script>元素不应该在其<script>和</script>标签之间再 包含额外的 JavaScript 代码。如果包含了嵌入的代码,则只会下载并执行外部脚本文件,嵌入的代码 会被忽略。
通过<script>元素的 src 属性还可以包含来自外部域的 JavaScript 文件。这一点既让 <script>元素倍显强大,又让它备受争议。在这一点上,<script>与<img>元素非常相似,即它的 src 属性可以是指向当前 HTML 页面所在域之外的某个域中的完整 URL,例如:
<script type="text/javascript" src="http://www.somewhere.com/afile.js"></script>
2.1.1 标签的位置
所有<script>元素都应该放在页面的<head>元素中
在文档的<head>元素中包含所有 JavaScript 文件,意味着必须等到全部 JavaScript 代码都被下载、 解析和执行完成以后,才能开始呈现页面的内容(浏览器在遇到<body>标签时才开始呈现内容)。
2.1.2 延迟脚本
- defer
这个属性的用途是表明脚本在执行时不会影响页 面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。
defer 属性只适用于外部脚本文件
2.1.3 异步脚本
- async
标记为 async 的脚本并不保证按照指定它们的先后顺序执行
2.1.4 在XHTML中的用法
可扩展超文本标记语言,即 XHTML(Extensible HyperText Markup Language),是将 HTML 作为 XML 的应用而重新定义的一个标准。编写 XHTML 代码的规则要比编写 HTML 严格得多,而且直接影 响能否在嵌入 JavaScript 代码时使用<script/>标签。
避免在XHTML中出现语法错误
- 一是用相应的 HTML 实体(<)替换代码中所有的小于号(<),替换后的代码类似如下所示
- 保证让相同代码在 XHTML 中正常运行的第二个方法,就是用一个 CData 片段来包含 JavaScript 代 码。
第三章 基本概念
3.1 区分大小写
3.1.4 严格模式
“use strict”
严格模式是为 JavaScript 定义了一种不同的 解析与执行模型。在严格模式下,ECMAScript 3 中的一些不确定的行为将得到处理,而且对某些不安全 的操作也会抛出错误。
3.1.5 语句
ECMAScript 中的语句以一个分号结尾;
3.2 关键字和保留字
break
case
catch
continue
debugger*
default
delete
do instanceof
else new
finally return
for switch
function this
if throw
in try
typeof
var
void
while
with
3.3 变量
ECMAScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说, 每个变量仅仅是一个用于保存值的占位符而已。定义变量时要使用 var 操作符(注意 var 是一个关键 字),后跟变量名(即一个标识符),如下所示:
var message;
有一点必须注意,即用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说, 如果在函数中使用 var 定义一个变量,那么这个变量在函数退出后就会被销毁
虽然省略 var 操作符可以定义全局变量,但这也不是我们推荐的做法。因为在局 部作用域中定义的全局变量很难维护,而且如果有意地忽略了 var 操作符,也会由于 相应变量不会马上就有定义而导致不必要的混乱。给未经声明的变量赋值在严格模式 下会导致抛出 ReferenceError 错误。
3.4 数据类型
- undefined
- null
- boolean
- number
- string
- object
3.4.1 typeof操作符
3.4.2 undefines 类型
在使用 var 声明变量但未对其加以初始化时,这个变量的值就是undefined
3.4.3 null类型
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值
实际上,undefined 值是派生自 null 值的,因此 ECMA-262 规定对它们的相等性测试要返回 true:
alert(null == undefined); //true
3.4.3 Boolean
3.4.5 Number
用 e 表示法 表示的数值等于 e 前面的数值乘以 10 的指数次幂。ECMAScript 中 e 表示法的格式也是如此,即前面是 一个数值(可以是整数也可以是浮点数),中间是一个大写或小写的字母 E,后面是 10 的幂中的指数, 该幂值将用来与前面的数相乘。下面是一个使用 e 表示法表示数值的例子:
var floatNum = 3.125e7; // 等于31250000
ECMAScript 能够表示的最小数值保 存在 Number.MIN_VALUE 中——在大多数浏览器中,这个值是 5e-324;能够表示的最大数值保存在 Number.MAX_VALUE 中
任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN,这 个特点在多步计算中有可能导致问题。其次,NaN 与任何值都不相等,包括 NaN 本身。
为了消除在使用 parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换 时使用的基数(即多少进制)。
- parseInt
- parseFloat
3.4.6 String类型
String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串
3.4.7 Object类型
ECMAScript 中的对象其实就是一组数据和功能的集合。对象可以通过执行 new 操作符后跟要创建 的对象类型的名称来创建。而创建 Object 类型的实例并为其添加属性和(或)方法,就可以创建自定 义对象,如下所示:
- constructor:保存着用于创建当前对象的函数
- hasOwnProperty(propertyName): 用于检查给定的属性在当前对象实例中是否存在
- isPrototypeOf(Object) 用于检查传图对象是否是当前对象的原型
- propertyIsEnumerable(propertyName)用于检查给定的属性是否能够for-in
由于在 ECMAScript 中 Object 是所有对象的基础,因此所有对象都具有这些基本的属性和方法。
3.5 操作符
相等和不相等——先转换再比较,全等和不全等——仅比较而不转换。
ECMAScript 中的相等操作符由两个等于号(==)表示。
除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符没有什么区别。
3.6 语句
3.6.5 for-in 语句
for(property in expression) statement
for(var propertyName in window){
document.write(propertyName);
}
ECMAScript 对象的属性没有顺序。因此,通过 for-in 循环输出的属性名的顺序是不可预测的
3.6.6 label语句
使用 label 语句可以在代码中添加标签,以便将来使用。以下是 label 语句的语法
3.6.8 with
with 语句的作用是将代码的作用域设置到一个特定的对象中。with 语句的语法如下
with (expression) statement;
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
在这个重写后的例子中,使用 with 语句关联了 location 对象。这意味着在 with 语句的代码块 内部,每个变量首先被认为是一个局部变量,而如果在局部环境中找不到该变量的定义,就会查询 location 对象中是否有同名的属性。如果发现了同名属性,则以 location 对象属性的值作为变量的值。
3.7 函数
ECMAScript 中的函数使用 function 关键字来声明,后跟一组参数以及函数体。
3.7.1 理解参数
ECMAScript函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript函数不介意传递进 来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数, 在调用这个函数时也未必一定要传递两个参数。
原因是 ECMAScript 中的参数在内部是用一个数组来表示的。函数接收 到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任 何元素,无所谓;如果包含多个元素,也没有问题。实际上,在函数体内可以通过 arguments 对象来 访问这个参数数组,从而获取传递给函数的每一个参数
arguments 对象只是与数组类似(它并不是 Array 的实例),因为可以使用方括号语法访 问它的每一个元素(即第一个元素是 arguments[0],第二个元素是 arguments[1],以此类推)
命名的参数只提供便利,但不是必需的。另 外,在命名参数方面,其他语言可能需要事先创建一个函数签名,而将来的调用必须与该签名一致。但 在 ECMAScript 中,没有这些条条框框,解析器不会验证命名参数。
通过访问 arguments 对象的 length 属性可以获知有多少个参数传递给了函数。
明明参数只是为了提供便利
关于 arguments 的行为,还有一点比较有意思。那就是它的值永远与对应命名参数的值保持同步
function doAdd(num1, num2) {
arguments[1] = 10;
alert(arguments[0] + num2);
}
每次执行, 会讲第二个参数修改为10, 因为arguments对象中的值会自动反映到对应的命名参数,所以修改arguments[1],也就修改了num2
他并不是说读取这两个值会访问相同的内存空间,他们的内存空间是独立的,但是他们的值会同步
没有传递值的命名参数将自动被赋予 undefined 值
ECMAScript 中的所有参数传递的都是值,不可能通过引用传递参数
3.7.2 没有重载
ECMAScript 函数不能像传统意义上那样实现重载。而在其他语言(如 Java)中,可以为一个函数 编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。
如果在 ECMAScript 中定义了两个名字相同的函数,则该名字只属于后定义的函数。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。