第一章
- 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 中定义了两个名字雷同的函数,则该名字只属于后定义的函数。